Sayı arttırma ve azaltma

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Kullanıcı avatarı
Dostk
Üye
Mesajlar: 144
Kayıt: 22 Ağu 2015 12:21

Sayı arttırma ve azaltma

Mesaj gönderen Dostk »

Merhabalar;

Noktalı bir sayıyı 1000 arttırma ve 1000 azaltma yaptırmak istiyorum fakat çıkamadım işin içinden...

Örnek: 23.4545 den 1000 azalttığımda 23.3545 olacak bu işlemi nasıl yapabilirim.

StrtoFloat('23.4145')
Kullanıcı avatarı
esistem
Üye
Mesajlar: 464
Kayıt: 02 Eki 2007 11:22
İletişim:

Re: Sayı arttırma ve azaltma

Mesaj gönderen esistem »

StrtoFloat('23.4145')-0.1 yaparsan olur o iş, yada x-1/10 yaparsan 0.1 azaltırsın 1/100 yaparsan 0.01 azaltırsın ondalık kısmın neresiyle oynıyacağına bağlı olarak bölersin olur biter, onda bir, yüzde bir, binde bir gibi
Kullanıcı avatarı
Dostk
Üye
Mesajlar: 144
Kayıt: 22 Ağu 2015 12:21

Re: Sayı arttırma ve azaltma

Mesaj gönderen Dostk »

Sayın esistem;
esistem yazdı:StrtoFloat('23.4145')-0.1 yaparsan olur o iş, yada x-1/10 yaparsan 0.1 azaltırsın 1/100 yaparsan 0.01 azaltırsın ondalık kısmın neresiyle oynıyacağına bağlı olarak bölersin olur biter, onda bir, yüzde bir, binde bir gibi

Dediğiniz gibi bir çok yöntem denedim fakat sanırım başaramadım; fakat sanırım sorunumu tam anlatamadım 23.4545 den 1000 sayısı çıkartırken 23.3545 ise 23.0100 den 1000 sayısı çıkarıldığında kalan 22.0100 olmalı umarın anlatabilmişimdir...
Kullanıcı avatarı
fesiharslan
Üye
Mesajlar: 591
Kayıt: 20 Eki 2006 11:37
Konum: Erzurum
İletişim:

Re: Sayı arttırma ve azaltma

Mesaj gönderen fesiharslan »

Merhaba;
Inc fonksiyonu ile sayısal bir değeri istediğiniz miktarda artırabilir, Dec fonksiyonu ile de istediğiniz miktarda azaltabilirsiniz.

Örneğin;

Kod: Tümünü seç

Sayı:=234545;
YeniSayi:=Dec(Sayı,1000);
Yukarıdaki örnekte Sayı=234545, YeniSayi= 233545 olacaktır.
İyi çalışmalar...
Kullanıcı avatarı
brs
Üye
Mesajlar: 626
Kayıt: 04 Eki 2012 03:52

Re: Sayı arttırma ve azaltma

Mesaj gönderen brs »

Fesiharslan hocam yanılıyorsam düzeltin; arkadaş float sayıdan integer sayıyı çıkarmak istiyor sizin verdiğiniz örnek integer...
İşi bilen yardım eder, az bilen akıl verir, bilmeyen eleştirir, yapamayan ise çamur atar...
Kullanıcı avatarı
Dostk
Üye
Mesajlar: 144
Kayıt: 22 Ağu 2015 12:21

Re: Sayı arttırma ve azaltma

Mesaj gönderen Dostk »

Tekrar selam arkadaşlar.

Sonuca yaklaştım, fakat virgül ile ayırma işlemi bir türlü olmadı, toplama işlemi gerçekleşiyor sonuç "291,320" veriyor fakat olması gereken ise "29,1320" virgül yanlış yerde bu neden kaynaklı olabilir...

Kod: Tümünü seç

procedure TForm1.Button3Click(Sender: TObject);
var
  Say: String;
  Total: Extended;
begin
  Say := StringReplace('29,0320', ',', '', [rfReplaceAll]);
  Total := StrToInt(Say) + 1000;
  Caption := FormatFloat('##,####', StrToFloat(FloatToStr(Total)));
end;
Kullanıcı avatarı
fesiharslan
Üye
Mesajlar: 591
Kayıt: 20 Eki 2006 11:37
Konum: Erzurum
İletişim:

Re: Sayı arttırma ve azaltma

Mesaj gönderen fesiharslan »

Merhaba;
Sayının StringReplace işlemine tabi tutulması, sayısal işlemde mantıksal hataya sebep oluyor. Yani nokta siliniyor ve sayı integer'a dönüşmüş oluyor. Ortaya çok farklı bir sayı çıkıyor.
StringReplace fonksiyonu yerine FormatSettings kullanılmalıdır.
Float tipine bir değişkeni kullanmadan önce veya formunun OnCreate olayına yazın. Aşağıdaki gibi kullanabilirsiniz.

Kod: Tümünü seç

SysUtils.FormatSettings.DecimalSeparator := ','; 
İyi çalışmalar...
En son fesiharslan tarafından 04 Haz 2016 12:04 tarihinde düzenlendi, toplamda 2 kere düzenlendi.
Kullanıcı avatarı
esistem
Üye
Mesajlar: 464
Kayıt: 02 Eki 2007 11:22
İletişim:

Re: Sayı arttırma ve azaltma

Mesaj gönderen esistem »

Dostk yazdı:

Kod: Tümünü seç

procedure TForm1.Button3Click(Sender: TObject);
var
  Say: String;
  Total: Extended;
begin
  Say := StringReplace('29,0320', ',', '', [rfReplaceAll]);
  Total := StrToInt(Say) + 1000;
  Caption := FormatFloat('##,####', StrToFloat(FloatToStr(Total)));
end;
Öncelikle 29,0320 yi 29.0320 yapman lazım replace ile virgülü boşluk yaparsan yeni sayın 290320 olur tabiki bundan 1000 eksiltirsen yanlış sonucu alırsın, x-(1/10) yaparsan istediğin sonucu alırsın, sen ondalık kısımdan sayı çıkartmaya çalışıyosun,
ayrıca; 23.0100 den senin anlattığın mantıkla 1000 eksiltirsen 22,9100 kalmazmı?
Kullanıcı avatarı
brs
Üye
Mesajlar: 626
Kayıt: 04 Eki 2012 03:52

Re: Sayı arttırma ve azaltma

Mesaj gönderen brs »

Sanırım bu işinizi çözecektir...

Kod: Tümünü seç

Showmessage(FormatFloat('##''.''####', StrToFloat(FloatToStr(Total))));
İş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: Sayı arttırma ve azaltma

Mesaj gönderen ertank »

Dostk yazdı:Dediğiniz gibi bir çok yöntem denedim fakat sanırım başaramadım; fakat sanırım sorunumu tam anlatamadım 23.4545 den 1000 sayısı çıkartırken 23.3545 ise 23.0100 den 1000 sayısı çıkarıldığında kalan 22.0100 olmalı umarın anlatabilmişimdir...
Merhaba,

Sizin yukarıda verdiğiniz örneğe göre durumu ben anlayamadım. Çünkü;

23.4545 - 0.1 = 23.3545
23.0100 - 1.0 = 22.0100

Bu durumda siz bazen 0.1, bazen de 1.0 rakamını çıkarıyorsunuz. Anlayamadığım konu ise bunu hangi durumda yapmamız gerektiği. Yani koşul nedir? Kendi adıma ancak koşul belli olduktan sonra tam anlamı ile yardımcı olabilirim.

Bununla birlikte, sizin verdiğiniz kod örneği ile ilgili aşağıdaki gibi bir düzenleme öneriyorum:

Kod: Tümünü seç

procedure TForm10.Button1Click(Sender: TObject);
var
  Say: String;
  // Extended ile Double her ikisi de sizin verdiğiniz ondalık hane derinliğinde aynı çalışır.
  // Ancak Extended kullanır iseniz 64bit sistemlerde (64bit derlenmiş EXE'den bahsetmiyorum) aslında Double kullanmış gibi olacaksınız. 
  // Detaylı açıklama için Extended ile ilgili Delphi yardım kısmını okuyabilirsiniz.
  Total: Double;
begin
  // Ondalık işareti genelde bir tane olur. Dolayısı ile aşağıdaki StringReplace içine [rfReplaceAll] eklemeye gerek görmedim.
  Say := StringReplace('29,0320', System.SysUtils.FormatSettings.ThousandSeparator, System.SysUtils.FormatSettings.DecimalSeparator, []);

  // Aşağıdaki satırdan itibaren koşula göre 0.1 ile 1.0 arasında karar vermek gerekli.
  Total := StrToFloat(Say) + 0.1;

  // FormatFloat içinde virgül binlik ayracıdır. Nokta ondalık ayracıdır. Bu her zaman böyledir. FormatSettings.DecimalSeparator ile ilgisi yoktur. 
  // FormatFloat geriye çevirdiği string içinde noktayı işletim sisteminde tanımlı olan ondalık işareti ile değiştirir.
  // Eğer Hep 4 ondalık hane kullanılacak ise aşağıdaki gibi bir Format tanımı vermek daha doğru olacaktır.
  // Böylece 22.01 gibi bir rakam 22.0100 şeklinde gösterilir. Eğer '#.####' gibi bir format kullanılır ise sonuç 23.01 şeklinde kalacaktır.
  // Total değişkenini Extended türünde kullansanız dahi FormatFloat() içinde direk kullanabilirsiniz. StrToFloat(FloatToStr(Total)) yapmanıza gerek yok
  Caption := FormatFloat('#.0000', Total);  
end;
Cevapla