Konuyu Oyla:
  • Derecelendirme: 0/5 - 0 oy
  • 1
  • 2
  • 3
  • 4
  • 5
Parayı çarpma ve toplama işlemi
#1
selamın aleyküm hayırlı ramazanlar;

Listviewde 2 tane parasal 1 tanede adet alanım var, Yani ürün fiyatı * adet = toplam olacak.

Örnek: 
125.000 * 5 = 625.000 TL
150 * 3 = 450 TL olacak, fakat bir türlü çarpma işlemini yaptıramadım sürekli hata alıyorum bu konuda yardımcı olur musunuz.

procedure TForm4.Hesap(Sender: TObject); // Hesaplama
var
  Fiyat, Adet, Toplam: Real;
  //: Currency;
begin
  if LV.Items.Count > 0 then
  begin
    With LV do
    begin
      Items.BeginUpdate;
      try
        for I := Items.Count - 1 downto 0 do
        begin
          Fiyat := strtofloat(Items[I].SubItems[2]);
          Adet := strtofloat(Items[I].SubItems[3]);
          Items[I].SubItems[4] := floattostr(Fiyat * Adet);
          // Toplam := Toplam + StrToInt(Items[I].SubItems[5]);
          // LabelToplam.Caption := 'Toplam: ' + Format(' %e', [Toplam]);
        end;
      finally
        Items.EndUpdate;
      end;
    end;
  end;
end;

Hata kodu: First chance exception at $752E845D. Exception class EConvertError with message ''500.000' is not a valid floating point value'. Process Follow.exe (5424)
Cevapla
#2
real sayılar ondalıklı sayılardır bu işlemleri yapabilmek için nokta(.) değil virgül(,) kullanmak gerekir hatanın sebebi budur.
Cevapla
#3
1000'lik ayırıcı kullanma yada dönüşümde sil.
Ağlarsa kablosuz ağlar, gerisi yerel ağlar...
Cevapla
#4
var
 WFormatoBR: TFormatSettings;
begin
 WFormatoBR                     := TFormatSettings.Create;
 WFormatoBR.DecimalSeparator    := ',';
 WFormatoBR.ThousandSeparator   := '.';
 System.SysUtils.FormatSettings := WFormatoBR;
end;

gibi yöntemle ondalık ve binlik ayıracını kendi kullanım için ayarlayabilirsin.
Cevapla
#5
Kısmen yaptım, ama 15,000 * 3 =  45,000 olması lazım fakat 45 olarak veriyor virgülden sonraki değerleri nasıl alabilirim?




function NoktaConvert(StrNokta: String): String; // Noktayı virgüle çevir
begin
 Result := StringReplace(StrNokta, '.', ',', [rfReplaceAll, rfIgnoreCase]);
end;

procedure TForm4.Hesap(Sender: TObject); // Hesaplama
var
 Fiyat, Adet: Real;
begin
if LV.Items.Count > 0 then
 begin
   With LV do
   begin
     Items.BeginUpdate;
     try
       for I := Items.Count - 1 downto 0 do
       begin
         Fiyat := StrToFloat(NoktaConvert(Items[I].SubItems[2]));
         Adet := StrToFloat(Items[I].SubItems[3]);

         Items[I].SubItems[4] := FloatToStr(Fiyat * Adet);
       end;
     finally
       Items.EndUpdate;
     end;
   end;
 end;
end;
Cevapla
#6
15,000
onbeşbin mi? onbeş mi?
Cevapla
#7
(16-06-2017, Saat: 23:28)serhat Adlı Kullanıcıdan Alıntı: Kısmen yaptım, ama 15,000 * 3 =  45,000 olması lazım fakat 45 olarak veriyor virgülden sonraki değerleri nasıl alabilirim?




function NoktaConvert(StrNokta: String): String; // Noktayı virgüle çevir
begin
 Result := StringReplace(StrNokta, '.', ',', [rfReplaceAll, rfIgnoreCase]);
end;

procedure TForm4.Hesap(Sender: TObject); // Hesaplama
var
 Fiyat, Adet: Real;
begin
if LV.Items.Count > 0 then
 begin
   With LV do
   begin
     Items.BeginUpdate;
     try
       for I := Items.Count - 1 downto 0 do
       begin
         Fiyat := StrToFloat(NoktaConvert(Items[I].SubItems[2]));
         Adet := StrToFloat(Items[I].SubItems[3]);

         Items[I].SubItems[4] := FloatToStr(Fiyat * Adet);
       end;
     finally
       Items.EndUpdate;
     end;
   end;
 end;
end;

Merhaba Serhat Bey,
Kurmuş olduğunuz algoritmada mantıksal bir hata (fatal error Smile ) var.
Bu algoritmayı adımlayacak olursak;
Örneğin Tutar = 15.000,00 TL olsun, Adet = 3 olsun
NoktaConvert adımında Tutar = 15,000,00 olacaktır.
Fiyat * Adet = tahminimce 45 gibi bir sonuç olacaktır. (Test imkanım şu an için olmadığından sonuç konusunda net birşey söyleyemiyorum)
Cevapla
#8
     Items.BeginUpdate;
    try
      for I := Items.Count - 1 downto 0 do
      begin
        Fiyat := StrToFloat(NoktaConvert(Items[I].SubItems[2]));
        Adet := StrToFloat(Items[I].SubItems[3]);

//         Items[I].SubItems[4] := FloatToStr(Fiyat * Adet);  // eski hali
          Items[I].SubItems[4] := formatfloat('###.##0,000',Fiyat * Adet); //deneme hali
      end;
    finally
      Items.EndUpdate;
    end;

binlik ayıracı = . (nokta)
ondalık ayıracı = , (virgül)
kodu bir de böyle deneyin
Cevapla
#9
Cevaplar için teşekkür ederim.
Cevapla
#10
formatfloat komutunu kullanabilirsin yazdırırken
formatfloat('0,00',25);
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
Smile TrayIcon ile BringToFront işlemi mcuyan 0 158 30-11-2023, Saat: 21:27
Son Yorum: mcuyan
  Delphide time alanını toplama shooterman 3 510 14-09-2023, Saat: 13:03
Son Yorum: shooterman
  farkli tablolardan verileri dataset e toplama sadikacar60 12 1.825 23-03-2023, Saat: 18:34
Son Yorum: sadikacar60
  Delphi 7 Veri Tabanı İşlemi Hakkında mahone 6 1.016 28-02-2023, Saat: 15:36
Son Yorum: mahone
  Rest Debugger ile POST işlemi 41linea41 0 444 18-10-2022, Saat: 20:25
Son Yorum: 41linea41



Konuyu Okuyanlar: 1 Ziyaretçi