formatcurr işleminden sonra toplama işlemi

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
sako
Üye
Mesajlar: 473
Kayıt: 11 Haz 2003 02:40
Konum: ERZURUM

formatcurr işleminden sonra toplama işlemi

Mesaj gönderen sako »

Aşağıdaki kod ile stringgrid içindeki sayıları örnek olarak 1.500,1.300 vs. yapıyorum. Ancak bu sayıları daha sonra toplarken is not a valid floating point value hatası alıyorum. Eski hallerine de çevirmeye kalksam aynı hatayı alıyorum. Nasıl yapabilirim acaba ?
for j:=1 to 11 do begin
For i:=1 to 6 do begin
format:= strtocurr(Odenekgrid.Cells[i,j]);
Odenekgrid.Cells[i,j]:=Formatcurr('#,###',format);

End;
end;
DOĞUNUN SINIR TAŞI ERZURUM'UN DADAŞ'I
EFE'Sİ VAR İZMİR'İN EĞİLMEZ TÜRK' ÜN BAŞI
Kullanıcı avatarı
freeman35
Admin
Mesajlar: 2356
Kayıt: 12 Haz 2003 04:05
Konum: merkez camii yanı

Re: formatcurr işleminden sonra toplama işlemi

Mesaj gönderen freeman35 »

"format" delphi nin bir function adıdır, değişken olarak kullanamazsın. Bunlara dikkat edin.
neden curr? float değil?
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 !!!
ertank
Kıdemli Üye
Mesajlar: 1650
Kayıt: 12 Eyl 2015 12:45

Re: formatcurr işleminden sonra toplama işlemi

Mesaj gönderen ertank »

sako yazdı: 23 Haz 2021 12:54 Eski hallerine de çevirmeye kalksam
Merhaba,

Eski haline çevirme kodunuzu paylaşabilir misiniz? Muhtemelen o noktada bir hatanız var.

Kullandığınız değişken isimlerini daha dikkatli seçmeniz konusuna bende katılıyorum. Yerel değişkenler (sadece prosedür/fonksiyon içinde kullanılan) için İngilizce Local, Türkçe yerel anlamında başına L harfi ekleyebilirsiniz mesela.
sako
Üye
Mesajlar: 473
Kayıt: 11 Haz 2003 02:40
Konum: ERZURUM

Re: formatcurr işleminden sonra toplama işlemi

Mesaj gönderen sako »

ertank yazdı: 23 Haz 2021 10:42
sako yazdı: 23 Haz 2021 12:54 Eski hallerine de çevirmeye kalksam
Merhaba,

Eski haline çevirme kodunuzu paylaşabilir misiniz? Muhtemelen o noktada bir hatanız var.

Kullandığınız değişken isimlerini daha dikkatli seçmeniz konusuna bende katılıyorum. Yerel değişkenler (sadece prosedür/fonksiyon içinde kullanılan) için İngilizce Local, Türkçe yerel anlamında başına L harfi ekleyebilirsiniz mesela.
Eski hali derken virgülleri kaldırıp işlem yapmak için aşağıdaki gibi dezeltmeye çalışırken hata alıyorum. Biraz acemice bir yöntem olduğunu düşünüyorum :? :oops:

for j:=1 to 11 do begin
For i:=1 to 6 do begin
format:= strtocurr(Odenekgrid.Cells[i,j]);
Odenekgrid.Cells[i,j]:=Formatcurr('#',format);
End;
end;
DOĞUNUN SINIR TAŞI ERZURUM'UN DADAŞ'I
EFE'Sİ VAR İZMİR'İN EĞİLMEZ TÜRK' ÜN BAŞI
ertank
Kıdemli Üye
Mesajlar: 1650
Kayıt: 12 Eyl 2015 12:45

Re: formatcurr işleminden sonra toplama işlemi

Mesaj gönderen ertank »

Paylaştığınız kod virgül kaldırma yapmıyor. Eğer tüm hücrelerde rakam var ise, siz tüm hücrelerin toplamını almak istiyor iseniz. Aşağıdaki gibi bir kod kullanabilirsiniz.

Kod: Tümünü seç

procedure TForm2.Button1Click(Sender: TObject);
var
  I: Integer;
  I2: Integer;
  Toplam: Double;
  TempString: string;
  TempDouble: Double;
  AFormatSettings: TFormatSettings;
begin
  AFormatSettings := TFormatSettings.Create('en-US'); // nokta ondalık ayracı olarak kullanılacak
  Toplam := 0;
  for I := 1 to 11 do
  begin
    for I2 := 1 to 6 do
    begin
      TempString := Odenekgrid.Cells[I2, I];
      // Binlik ayraçlarını siliyoruz
      TempString := StringReplace(TempString, FormatSettings.ThousandSeparator, EmptyStr, [rfReplaceAll]);
      // Ondalık işaretini nokta olarak değiştiriyoruz (eğer noktadan farklı ise)
      TempString := StringReplace(TempString, FormatSettings.DecimalSeparator, '.', []);
      // Para birimi ifadesi kaldırılıyor
      TempString := StringReplace(TempString, FormatSettings.CurrencyString, EmptyStr, []);
      // Boşluk karakterleri kaldırılıyor
      TempString := StringReplace(TempString, ' ', EmptyStr, [rfReplaceAll]);
      if TempString <> EmptyStr then
      begin
        if TryStrToFloat(TempString, TempDouble, AFormatSettings) then
        begin
          Toplam := Toplam + TempDouble;
        end
        else
        begin
          // Hata oluştu. Dönüşüm yapılamadı. sebebi incelenmeli. Burada duruma göre log kaydı tutulabilir.
        end;
      end;
    end;
  end;
  ShowMessage('Toplam: ' + FloatToStr(Toplam));
end;
Örnek kod test edilmedi. Delphi 10.3 ile derlenebiliyor. Eğer Delphi 7 gibi eski bir sürüm kullanıyor iseniz belli noktalarda (FormatSettings Delphi 7'de mevcut değildir) düzenlemeler yapmanız gerekecektir. Eğer sistemde tanımlı olandan başka bir para birimi simgesi/ifadesi kullanıyor iseniz bunu da ek olarak TempString içinden silmeniz gerekecektir.
sako
Üye
Mesajlar: 473
Kayıt: 11 Haz 2003 02:40
Konum: ERZURUM

Re: formatcurr işleminden sonra toplama işlemi

Mesaj gönderen sako »

Cevaplar için teşekkür ederim aşağıdaki kod ile noktaları kaldırıp sonrasında toplama işlemini yaptırdım sıkıntı çıkmadı. Yine biraz acemice olmuş olabilir ama işimi gördü. :)
var
s, sil: string;
i,j:integer;
begin

for j:=1 to 11 do begin
For i:=1 to 6 do begin
s := Odenekgrid.Cells[i,j];
sil := '.';
While Pos(sil,S)>0 do Delete(s,Pos(sil,S),length(sil));
Odenekgrid.Cells[i,j]:=s;
end;
end;
DOĞUNUN SINIR TAŞI ERZURUM'UN DADAŞ'I
EFE'Sİ VAR İZMİR'İN EĞİLMEZ TÜRK' ÜN BAŞI
Kullanıcı avatarı
freeman35
Admin
Mesajlar: 2356
Kayıt: 12 Haz 2003 04:05
Konum: merkez camii yanı

Re: formatcurr işleminden sonra toplama işlemi

Mesaj gönderen freeman35 »

Tavsiyem, @ertank ın kodunu kullanman.
"FormatSettings.ThousandSeparator" ile senin yazdığın "sil := '.';" arasındaki fark, senin kodun, işletim sisteminin ayarları değiştirildiğinde kodun hata verir. Başka makinalarda çalışırsa, bölgesel ayarlar değiştirildiğinde vs vs

StringReplace(TempString, FormatSettings.ThousandSeparator, EmptyStr, [rfReplaceAll]);
ile senin yaptığın döngü, aynı sonuç döndürür ama yukarıdaki kodun hata döndündürme ihtimali yok
While Pos(sil,S)>0 do Delete(s,Pos(sil,S),length(sil));

yaptım oldu diyorsan başka tabi.
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 !!!
Cevapla