Para birimleri

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Kullanıcı avatarı
greenegitim
Üye
Mesajlar: 713
Kayıt: 28 Nis 2011 10:33
Konum: İstanbul

Re: Para birimleri

Mesaj gönderen greenegitim »

yanlış anlamadıysam sen kullanıcı ne noktaya basın nede virgüle yazdıkça basamağına göre sen göstermek istiyorsun doğrumu?
Mücadele güzelleştirir!
Kullanıcı avatarı
Serhat
Üye
Mesajlar: 203
Kayıt: 27 Tem 2014 11:10

Re: Para birimleri

Mesaj gönderen Serhat »

Aynen kullanıcı rakam girdikçe nokta ve virgüller duruma göre pozisyonunu alacak yani otomatik girilecek, kodları bir yere kadar getirdim fakat takıldım kaldım.


Kod: Tümünü seç

function Izin(StrChar: String; Delimiter: Char): Integer;
var
  Sxx: String;
  X, J: Integer;
begin
  Sxx := '';
  Result := 0;
  for X := 1 to Length(StrChar) do
  begin
    if StrChar[X] <> Delimiter then
      Sxx := Sxx + StrChar[X]
    else
    begin
      Inc(Result);
      Sxx := '';
    end;
    for J := 1 to Length(StrChar) do
    begin
    
    
      Form1.caption := IntToStr(Length(StrChar));
      
      
      
    end;
  end;
end;

Kod: Tümünü seç

procedure TForm1.Edit2KeyPress(Sender: TObject; var Key: Char);
begin
  if (Izin(Edit2.Text, ',') >= 1) and (Not(Key in ['0' .. '9', '.', #8])) then
  begin
    Key := #0;
  end;
  if (Izin(Edit2.Text, '.') >= 1) and (Not(Key in ['0' .. '9', ',', #8])) then
  begin
    Key := #0;
  end;
end;
Kullanıcı avatarı
brs
Üye
Mesajlar: 626
Kayıt: 04 Eki 2012 03:52

Re: Para birimleri

Mesaj gönderen brs »

Ekstra olarak exit yöntemi kullanabilirsin 1500 yazınca 1.500 oluyor buraya kadar sorun yok.
İşin içine küsurat girince sonuç sapıtıyor. 150030 bin beş yüz lira 30 kuruş oluyor, 150.030,00 bunu çözebilirsen istediğini yapabilirsin.

Kod: Tümünü seç

procedure TForm1.Edit1Exit(Sender: TObject);
begin
  if (Length(Edit1.Text) > 2) and (Length(Edit1.Text) < 8 ) then
  begin
    Edit1.Text := Format('%n', [strtofloat(Edit1.Text)]);
  end;
end;
En son brs tarafından 07 Tem 2017 08:55 tarihinde düzenlendi, toplamda 2 kere düzenlendi.
İşi bilen yardım eder, az bilen akıl verir, bilmeyen eleştirir, yapamayan ise çamur atar...
ertank
Kıdemli Üye
Mesajlar: 1650
Kayıt: 12 Eyl 2015 12:45

Re: Para birimleri

Mesaj gönderen ertank »

Serhat yazdı:Olay şu, kullanıcı editten sayı girmeye başlayınca 123456 gibi

1. örnek sayı 15
0,15 olacak

2. örnek sayı 130
1,30 olacak

3. örnek sayı 1535
1.535 olacak

4. örnek sayı 250035
2.500,35 olacak

Ben bir şeyler yapmaya çalıştım ama olmadı bir süre sonra anlamsız durum ortaya çıkıyor

Kod: Tümünü seç

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
  if (Length(Edit1.Text) = 1) and (Key <> #08) then
  begin
    Edit1.Text := Edit1.Text + '.';
    Edit1.SelStart := Length(Edit1.Text);
  end;
  if (Length(Edit1.Text) = 5) and (Key <> #08) then
  begin
    Edit1.Text := Edit1.Text + ',';
    Edit1.SelStart := Length(Edit1.Text);
  end;
end;
Yukarıdaki şekilde yapmanız mümkün değil. 3. örnek ile belirttiğiniz 1535 rakamının tamsayı mı yoksa 15,35 mi olduğunu sadece girilen rakam üzerinden bulmak mümkün değil. Bunu daha önce @freeman35 size açıklamaya çalıştı.

Şu koşul ile yapmak istediğiniz mümkün. Son 2 hane her zaman için kuruş olur. 1535 rakamını 153500 şeklinde girilmesi zorunludur. Bunun dışında benim önerdiğim ikili TEdit bileşeni veya @freeman35'in önderdiği para birimi Edit etmeye yarayan özel bir bileşen kullanmanız gerekir.
Kullanıcı avatarı
brs
Üye
Mesajlar: 626
Kayıt: 04 Eki 2012 03:52

Re: Para birimleri

Mesaj gönderen brs »

ertank yazdı:
Serhat yazdı:Olay şu, kullanıcı editten sayı girmeye başlayınca 123456 gibi

1. örnek sayı 15
0,15 olacak

2. örnek sayı 130
1,30 olacak

3. örnek sayı 1535
1.535 olacak

4. örnek sayı 250035
2.500,35 olacak

Ben bir şeyler yapmaya çalıştım ama olmadı bir süre sonra anlamsız durum ortaya çıkıyor

Kod: Tümünü seç

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
  if (Length(Edit1.Text) = 1) and (Key <> #08) then
  begin
    Edit1.Text := Edit1.Text + '.';
    Edit1.SelStart := Length(Edit1.Text);
  end;
  if (Length(Edit1.Text) = 5) and (Key <> #08) then
  begin
    Edit1.Text := Edit1.Text + ',';
    Edit1.SelStart := Length(Edit1.Text);
  end;
end;
Yukarıdaki şekilde yapmanız mümkün değil. 3. örnek ile belirttiğiniz 1535 rakamının tamsayı mı yoksa 15,35 mi olduğunu sadece girilen rakam üzerinden bulmak mümkün değil. Bunu daha önce @freeman35 size açıklamaya çalıştı.

Şu koşul ile yapmak istediğiniz mümkün. Son 2 hane her zaman için kuruş olur. 1535 rakamını 153500 şeklinde girilmesi zorunludur. Bunun dışında benim önerdiğim ikili TEdit bileşeni veya @freeman35'in önderdiği para birimi Edit etmeye yarayan özel bir bileşen kullanmanız gerekir.

Size katılmıyorum, kullanıcı isterse ekler yani satılan ürün küsuratı varsa eklenir,

Örnek Ali'nin maaşı

1.500 TL
yada
1.500 TL 30 Kuruş olamaz mı?

Bu arada neden ikici bir edit olsun ki tekbir edit işi görür
En son brs tarafından 07 Tem 2017 09:40 tarihinde düzenlendi, toplamda 1 kere düzenlendi.
İşi bilen yardım eder, az bilen akıl verir, bilmeyen eleştirir, yapamayan ise çamur atar...
Kullanıcı avatarı
brs
Üye
Mesajlar: 626
Kayıt: 04 Eki 2012 03:52

Re: Para birimleri

Mesaj gönderen brs »

Adamlar yapmış



Resim




Resim
İşi bilen yardım eder, az bilen akıl verir, bilmeyen eleştirir, yapamayan ise çamur atar...
ertank
Kıdemli Üye
Mesajlar: 1650
Kayıt: 12 Eyl 2015 12:45

Re: Para birimleri

Mesaj gönderen ertank »

brs yazdı:Size katılmıyorum, kullanıcı isterse ekler yani satılan ürün küsuratı varsa eklenir,

Örnek Ali'nin maaşı

1.500 TL
yada
1.500 TL 30 Kuruş olamaz mı?

Bu arada neden ikici bir edit olsun ki tekbir edit işi görür
Fikir ayrılıkları daha iyi yöntemlerin bulunmasına en büyük yardımcıdır muhakkak. Ancak, cevabımda daha önce de önerilen "para birimi edit etmeye yarayan özel bir bileşen" diye yazdığım kısım da vardı.

Sizin verdiğiniz örnekte ki gibi bir ayrımı bazı kuralları netleştirmeden yapmak mümkün olmayacaktır. Kuruş mu yoksa TL mi yazıldığını anlamak ne şekilde mümkün olacak? Nokta veya virgül karakterine basılarak ise bu bir kural tanımlamasıdır. Ya da son iki hane sürekli kuruş olarak kullanılır diyebiliriz diye düşünüyorum. Ancak bu tanımların her birisi kuruş ile TL'yi ayırd edebilmek için programcının belirleyeceği bir kural olacaktır.

@freeman35 ile bilrikte özetle bunu vurgulamak istemiştik.

Şu anda geliştirilmeye çalışılan bileşen için alternatif görüş olması açısından; mevcut ücretsiz bileşenler üzerinde değişiklik yapılması mümkün olabilir. Hatta belki bir tanesi tam istenildiği şekilde çalışıyor dahi olabilir. Unutulmamalı ki bu bileşenler zaman içinde yeni sürümler çıkarıp karşılaşılan hataları giderilmiş olacaktır.

Aşağıda birkaç örnek bulunabilir.
http://swag.outpostbbs.net/DELPHI/0006.PAS.html
http://www.delphiforfun.org/Programs/De ... ponent.htm
http://torry.net/pages.php?id=92
Kullanıcı avatarı
freeman35
Admin
Mesajlar: 2356
Kayıt: 12 Haz 2003 04:05
Konum: merkez camii yanı

Re: Para birimleri

Mesaj gönderen freeman35 »

@brs merak ettiğimden soruyorum,
1.500 TL
yada
1.500 TL 30 Kuruş olamaz mı?

Edit e yukarıdakileri nasıl yazılacak ? 1.500 binlik ayaracı sen koyuyorsan bunca muhabbet boşuna yaptık demektir, yok biz kod ile koyduracaksak, ben şöle bir sayı girdim, bunu bana formatlayabilir misin?
355
bu 35 tl 50 kuruş mu? 3lira 55 kuruş mu?
yada bu sayı nasıl formatlanır
355355 --> 355,355 tl mi yoksa 3.553,55 tl mi(üç bin beş yüz elli üç lira, ellibeş kuruş)?
kuruşun boyutunu vermedikçe para formatı yapamazsınız, ya hepsi tl dir ya hepsi kuruştur, yada şu kadar hane kuruştur. şartı koymadan formatlanamaz.
ZAGOR TENAY TÜRK'tür... TÜRK kalacak...
Zoru başarırım, İmkansız zaman alır
FreeMan 35.5

Soru sormaya üşenmiyorsan, sorunun çözümünü yazmaya da üşenme !!!
Kullanıcı avatarı
brs
Üye
Mesajlar: 626
Kayıt: 04 Eki 2012 03:52

Re: Para birimleri

Mesaj gönderen brs »

Kafam iyice karıştı :roll: Edite 1500030 gibi bir sayı girildiğinde bana göre TL karşılığı 1.500,30 olmalı (bin beş yüz lira otuz kuruş)


Bu linkten kredi hesaplattım 100000 TL yazdım çıkan sonuç 113.938,31 TL biz bunu editte otomatik olarak niye yaptıramıyoruz.

http://www.hangikredi.com/kredi/hesapla ... oC0-nw_wcB

113.938,31 yüz on üç bin dokuz yüz otuz sekiz bin otuz bir kuruş yanlış mı yazdı bilemiyorum


örnek bir uygulama yaptım http://www.dosyaupload.com/4Rab tek sorun ondalık sayı önüne virgül giremedim :D
İşi bilen yardım eder, az bilen akıl verir, bilmeyen eleştirir, yapamayan ise çamur atar...
Kullanıcı avatarı
greenegitim
Üye
Mesajlar: 713
Kayıt: 28 Nis 2011 10:33
Konum: İstanbul

Re: Para birimleri

Mesaj gönderen greenegitim »

Resim
bu örnekte senin istediğin şeye benziyor ama bunda virgül ekliyor ve virgülden sonra otomatik 00 ekliyor kullanıcı rakamlara bastıkça formatlıyor yine kullanıcı ','(virgül) e bastığında virgülden sonraki hanelere konumlanıyor.
tavsiyem önce jedi componentlerinden jvcalcedit veya devexpress cxcalcedit e ve bunların displayformat özeliğine bakman belki fazlası ile işini görecektir şahsen hiç bu kadar takılmamıştım bu formatlama kısmına ekrana jvcalcedit koyup display formatını veriyorum bu zamana kadar bir kullanıcı bana yanlış veya istediğim gibi çalışmıyor demedi aklın yolu bir excel açın sutunu parasal olarak biçimlendirin sonra sayılar yazmayı deneyin.
Mücadele güzelleştirir!
jakarta2
Üye
Mesajlar: 74
Kayıt: 20 Nis 2015 06:51
İletişim:

Re: Para birimleri

Mesaj gönderen jakarta2 »

brs yazdı: 08 Tem 2017 01:23 Kafam iyice karıştı :roll: Edite 1500030 gibi bir sayı girildiğinde bana göre TL karşılığı 1.500,30 olmalı (bin beş yüz lira otuz kuruş)


Bu linkten kredi hesaplattım 100000 TL yazdım çıkan sonuç 113.938,31 TL biz bunu editte otomatik olarak niye yaptıramıyoruz.

http://www.hangikredi.com/kredi/hesapla ... oC0-nw_wcB

113.938,31 yüz on üç bin dokuz yüz otuz sekiz bin otuz bir kuruş yanlış mı yazdı bilemiyorum


örnek bir uygulama yaptım http://www.dosyaupload.com/4Rab tek sorun ondalık sayı önüne virgül giremedim :D
Edite 1500030 gibi bir sayı girildiğinde bana göre TL karşılığı 1.500,30 olmalı Bu kanıya nasıl vardın? Yazdığın sayı Birmilyonbeşyüzbinotuzdur. Nereye yazarsan yaz, kime sorarsan sor bu böyledir. kuruş'u mutlaka bir yerde ya da bir şekilde belirtmen gerekir.

Bu linkten kredi hesaplattım 100000 TL yazdım çıkan sonuç 113.938,31 TL Bak ne yazmışsın 100000 TL yazmışsın. O da bu sayıyı Yüzibin tl olarak almış sonra bir takım hesaplamalardan sonra kuruşu belirtmiş. Senin yapmak istediğin 100030 bu sayının yüzbin TL otuz kuruş olarak alması. Sence bu doğru olur mu o zaman?
jakarta2
Üye
Mesajlar: 74
Kayıt: 20 Nis 2015 06:51
İletişim:

Re: Para birimleri

Mesaj gönderen jakarta2 »

brs yazdı: 07 Tem 2017 09:01 Adamlar yapmış



Resim




Resim

Adamlar yapmış dediğine bir bak edit alanlarında ,00 var. Yani kuruş alanlarını önceden belirtmişler. 708 sayısını 7,08 almamış ya da 70,8 şeklinde almamış 708,00 almış.
3ddark
Üye
Mesajlar: 89
Kayıt: 14 Eyl 2010 10:55
Konum: İstanbul

Re: Para birimleri

Mesaj gönderen 3ddark »

Her tuşa basmada tekrar formatlayacakdin
Yapılır ama biraz fazla kod yazman gerekebilir.

Önce edit içindeki Nokta virgülü replace yaparak sil girilen tüm rakamları al sağdan 2 hane ondalık kısım olacak kalanlar tam sayı kısmı bunları formatla ve formatlı hâlini edite yaz. Tekrar tuşa basılınca aynı işlemi tekrarlayın
PostgreSQL - Delphi - Linux :!:
3ddark
Üye
Mesajlar: 89
Kayıt: 14 Eyl 2010 10:55
Konum: İstanbul

Re: Para birimleri

Mesaj gönderen 3ddark »

Kod: Tümünü seç

procedure TForm1.edtParaExit(Sender: TObject);
begin
  if Length(TEdit(Sender).Text) < 3 then
    TEdit(Sender).Text := '0' + FormatSettings.DecimalSeparator + TEdit(Sender).Text;
end;

Kod: Tümünü seç

procedure TForm1.edtParaKeyPress(Sender: TObject; var Key: Char);
var
  vText: string;
  vOndalik, vTamSayi: string;
  fOndalik, fTamsayi: Double;
  vSonuc: string;
  selPosition: Integer;
begin
  //sadece 0-9 arası rakamları ve backspace tusunu kabul et
  if CharInSet(Key, ['0'..'9', #8]) then
  begin
    selPosition := TEdit(Sender).SelStart;
    vText := TEdit(Sender).Text;  //edit içeriğini değişkene al
    if Length(vText) > 1 then
    begin
      if CharInSet(Key, ['0'..'9']) then  //basılan tuşu sayı ise araya ekle
      begin
        vText := LeftStr(vText, TEdit(Sender).SelStart) + Key + Copy(vText, TEdit(Sender).SelStart+1, Length(vText));
        Key := #0;  //keyi ekledikten sonra sil
      end
      else if Key = #8 then
        vText := LeftStr(vText, TEdit(Sender).SelStart-1) + Copy(vText, TEdit(Sender).SelStart+1, Length(vText));

      vText := StringReplace(vText, '.', '', [rfReplaceAll]); //varsa noktalar bunları sil
      vText := StringReplace(vText, ',', '', [rfReplaceAll]); //varsa virgul sil

      //3 karakterden az bilgi girilmişse zaten sadece ondalık kısım girilmiş demektir
      if Length(vText) < 3 then
      begin
        vOndalik := vText;
        vTamSayi := '0';
      end
      else
      begin
        vOndalik := RightStr(vText, 2); //sağdan iki karakter ondalık kısım
        vTamSayi := LeftStr(vText, Length(vText)-2) //sağdan iki karakter haricindeki tümü tam sayı kısmı
      end;

      fOndalik := StrToFloat('0' + FormatSettings.DecimalSeparator + vOndalik);
      fTamsayi := StrToFloat(vTamSayi);
      TEdit(Sender).Text := FloatToStrF(fTamsayi + fOndalik, ffNumber, 16, 2);
      //seçili pozisyona gel
      if  (selPosition > 0) and (selPosition < Length(TEdit(Sender).Text)) and (Key = #8) then
        TEdit(Sender).SelStart := selPosition-1
      else
        TEdit(Sender).SelStart := Length(TEdit(Sender).Text);
      Key := #0;
    end;
  end
  else
    Key := #0;
end;
Üşenmedim oturup vakit ayırdım yazdım. Umarım istediğiniz gibi olmuştur.
PostgreSQL - Delphi - Linux :!:
Cevapla