String değeri hesaplayarak İnteger'e Çevirme

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Kullanıcı avatarı
haydarxxx
Üye
Mesajlar: 668
Kayıt: 09 May 2005 11:31
Konum: izmir

String değeri hesaplayarak İnteger'e Çevirme

Mesaj gönderen haydarxxx »

Slm
Firebird veri tabanında varchar (string) olan alınıma 1/3 ,2/3 gibi değişken string değerler giriliyor ben bu alandaki değeri integer sayıya nasıl hesaplaytarak çevirtebilirim örneğin hesap makinasında bölme yaptırdığımızda

1/3 ün değeri 0,33333333333333 gibi
2/3 ün değeri 0,66666666666666 gibi bir değeri her girilen değer üzerinden nasıl buldura biliriz.Teşkkürler
Ancestor
Üye
Mesajlar: 188
Kayıt: 27 Ara 2004 06:12
Konum: Manisa - Kırkağaç

Mesaj gönderen Ancestor »

a.slm
Hocam, integer tam sayı değerlerini içerir. Eğer virgüllü işlem yapacaksanız float olarak deneyin.
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Mesaj gönderen aslangeri »

a.s.
string alana yazılan ifadeyi parse etmen lazım.
/ den önceki ve sonraki ifadeleri alıp birer değişkene atacaksın.
sonra değişkendeki değerleri böleceksin.
birde @Ancestor un dediği gibi bölem işleminin sonucunu integer olarak tutamazsın.
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
Kullanıcı avatarı
Lost Soul
Üye
Mesajlar: 1064
Kayıt: 01 Nis 2007 02:55
Konum: mekan ANKARA toprak ELAZIĞ
İletişim:

Mesaj gönderen Lost Soul »

ExtractStrings fonksiyonu string ifadeyi speratorler ile parçalara ayırabilirsin.
Burada seperator senin için '/' oluyor.
Kolay gelsin.
Kullanıcı avatarı
haydarxxx
Üye
Mesajlar: 668
Kayıt: 09 May 2005 11:31
Konum: izmir

Mesaj gönderen haydarxxx »

Arkadaşlar güzel açıklamışsınız teşekkürler ama bir örnek kod da yazsanız çok makbule geçerdi :lol:

integer ifadesi yanlış olmuş :cry: demek istediğim sayıya çevirme illagi integer tam sayı olması değildi kastetmek istediğim yani hesap makinası ile alınan bölme sonucu çıkacak değerdi ama tabiki diyeceksiniz ki biz nerden bilelim neyi kastetdiğini :oops: haklısınız.teşekkür ediyorum ama bir örnek kod da bekliyorum.sağolun
Kullanıcı avatarı
Lost Soul
Üye
Mesajlar: 1064
Kayıt: 01 Nis 2007 02:55
Konum: mekan ANKARA toprak ELAZIĞ
İletişim:

Mesaj gönderen Lost Soul »

Aceleyle senin için bi kod yazdım
Denedim çalışıyor :D
Resim
Ama işlem sırasını göz önünde tutmuyor.
Umarım işine yarar.


Formun Şekli

Kod: Tümünü seç

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    function islem( a,b : extended;islem : char) : extended;
    function stringislem(str : string) : extended;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}
Alt İşlem Yapan Fonksiyon

Kod: Tümünü seç

function tform1.islem( a,b : extended;islem : char) : extended;
begin
case ord(islem) of
  ord('+') : result:=a+b;
  ord('-') : result:=a-b;
  ord('*') : result:=a*b;
  ord('/') : result:=a/b;
  else
  result:=-1;
  end;
end;
Asıl işlemi yapan karar verici fonksiyon

Kod: Tümünü seç

function tform1.stringislem(str : string) : extended;
var
s :Tstrings;
i:integer;
isl : string;
e: extended;
begin
s:=Tstringlist.Create;
s.Clear;
isl:='';
ExtractStrings(['/','+','-','*'],['/','+','-','*'],pchar(str),s);
for i := 1 to length(str) do
if pos(str[i],'/+-*')>0 then isl:=isl+str[i];
e:=0;

for i := 0 to s.Count-1 do
  begin
  if i = 0 then
    begin
    e:=islem(strtofloat(s.Strings[i]),strtofloat(s.Strings[i+1]),isl[i+1]);
    end
    else
    if i<s.Count-1 then
    begin
    e:=islem(e,strtofloat(s.Strings[i+1]),isl[i+1]);
    end;
  end;


result:=e;
s.Free;

end;
Kullanımı

Kod: Tümünü seç

procedure TForm1.Button1Click(Sender: TObject);
begin
showmessage(floattostr(stringislem(edit1.Text)));
end;
:)
Kullanıcı avatarı
haydarxxx
Üye
Mesajlar: 668
Kayıt: 09 May 2005 11:31
Konum: izmir

Mesaj gönderen haydarxxx »

hocam elinize sağlık bende acele ile teşekür edeyim dedim :lol: en kısa zamanda deneyeceğim emeğiniz için teşekkür ediyorum
Kullanıcı avatarı
haydarxxx
Üye
Mesajlar: 668
Kayıt: 09 May 2005 11:31
Konum: izmir

Mesaj gönderen haydarxxx »

syn Lost Soul
problemsiz çalışıyor elinize sağlık bir proje olarak denedim buradan kendi projeme uyarlayacağım yanlız şöyle bir sorun var :oops:

kişi bu edit1.text e (yani burası dbedit1.text olacak string olarak yazılacak alan) yanlızca değeri 1 veya 2 veya 3 ..... gibi gibi tam sayı değerleri girildiğinde showmessageye sayısal değerini 1 veya 2 veya 3 gibi nasıl gösteririz yani sadece tam sayı olduğunda onla ilgili *,-,/,+, gibi işlem yapmasın direk değerini versin onuda bu koda nasıl katarız çünkü kullanıcı bu alana tam sayıda girebilecek şimdiden vereceğim zahmet için teşekkür ediyorum.
Kullanıcı avatarı
Lost Soul
Üye
Mesajlar: 1064
Kayıt: 01 Nis 2007 02:55
Konum: mekan ANKARA toprak ELAZIĞ
İletişim:

Mesaj gönderen Lost Soul »

haydarxxx yazdı:syn Lost Soul
problemsiz çalışıyor elinize sağlık bir proje olarak denedim buradan kendi projeme uyarlayacağım yanlız şöyle bir sorun var :oops:

kişi bu edit1.text e (yani burası dbedit1.text olacak string olarak yazılacak alan) yanlızca değeri 1 veya 2 veya 3 ..... gibi gibi tam sayı değerleri girildiğinde showmessageye sayısal değerini 1 veya 2 veya 3 gibi nasıl gösteririz yani sadece tam sayı olduğunda onla ilgili *,-,/,+, gibi işlem yapmasın direk değerini versin onuda bu koda nasıl katarız çünkü kullanıcı bu alana tam sayıda girebilecek şimdiden vereceğim zahmet için teşekkür ediyorum.
aslında fonksiyona bu özellik de eklenebilir ama.

try except bloğu arasında strtofloat koyarak except halinde verdiğim fonksiyonu çalıştırmayı da sağlayabilirsin.
ya da strtofloatdef (değer,-bilemkaç) diyip -bilmemkaç sonucu olduğunda yazdığım fonksiyonu çağırabilirsin.

Ha bu arada fonksiyona hata kontrolleri yerleştirmedim. Sen ihtiyaca göre gerekli düzenlemeleri yapmalısın ki programın kırılmaya uğramasın.

Kolay gelsin.
Kullanıcı avatarı
haydarxxx
Üye
Mesajlar: 668
Kayıt: 09 May 2005 11:31
Konum: izmir

Mesaj gönderen haydarxxx »

hocam şu kodla sorunu çözebiliyoruz belki ama

Kod: Tümünü seç

  try
showmessage(floattostr(stringislem(edit1.Text)));
    except
on E:Exception do
 end;


yanlız bu fonksiyonu ben şöyle bir işlem içinde kullanacağım haliyle tam sayı olduğunda bu işlemi yapamayacak :cry:

Kod: Tümünü seç

IBDataSet_SDETAY.FieldByName('GTUTARI').Value:=IBDataSet_SDETAY.FieldByName('GBGUN').Value*IBDataSet_SDETAY.FieldByName('KISISAYISI').Value * (floattostr(stringislem(IBDataSet_SDETAY.FieldByName('GUNSAYISI').Value)))  ;

Kod: Tümünü seç

floattostr(stringislem(IBDataSet_SDETAY.FieldByName('GUNSAYISI').Value olarak yada edit içindeki değer olarak[quote]try except bloğu arasında strtofloat koyarak except halinde verdiğim fonksiyonu çalıştırmayı da sağlayabilirsin. 
ya da strtofloatdef (değer,-bilemkaç) diyip -bilmemkaç sonucu olduğunda yazdığım fonksiyonu çağırabilirsin. 

ne olduğunu çıkaramadım :oops:
Kullanıcı avatarı
Lost Soul
Üye
Mesajlar: 1064
Kayıt: 01 Nis 2007 02:55
Konum: mekan ANKARA toprak ELAZIĞ
İletişim:

Mesaj gönderen Lost Soul »

Kodlarında neden "Value " deyimini kullanıyorsun ki.
Value; Variant tipinden bir değişken olduğu için tekrar tip dönüşümü gerektirir ve ex işlem demektir.
Onun yerine

Kod: Tümünü seç

FieldByName('XXX').AsCurrency; //Kayan noktalı değer
FieldByName('XXX').AsInteger;
FieldByName('XXX').AsDateTime;
FieldByName('XXX').AsString;
vs.vs.
ifadelerini kullan.
Ayrıca veritabanlarındaki field lara ulaşırken.
Örneğin integer tipinde olan bir değere string miş gibi davranabilirsin.
Mesela ID isimli integer bir Field için

Kod: Tümünü seç

FieldByName('ID').AsString
diyebilirsin.
hesaplama için Filed'a AsCurrency olarak, benim verdiğim fonksiyonda kullanacağın Field'a da AsString olarak davranmayı dene.

try except bloğu arasında strtofloat koyarak except halinde verdiğim fonksiyonu çalıştırmayı da sağlayabilirsin.
ya da strtofloatdef (değer,-bilemkaç) diyip -bilmemkaç sonucu olduğunda yazdığım fonksiyonu çağırabilirsin.
ifadesinde demek istediğim.

senin fonksiyon ile kontrl etmek istediğin alan 'GUNSAYISI' ise
ve 'GUNSAYISI' alanının işlem mi yoksa sayı mı olduğunu anlamak için
aşağıdaki yötemi dneyebilirsin.
'GUNSAYISI' değer negatif bir sayı olamayacağına göre.

Kod: Tümünü seç

if strtointdef(IBDataSet_SDETAY.FieldByName('GUNSAYISI').AsString,-1)< 0 
then stringislem(IBDataSet_SDETAY.FieldByName('GUNSAYISI').AsString) 
else strttoint(IBDataSet_SDETAY.FieldByName('GUNSAYISI').AsString)
şeklinde bi kod kullanarak bunun zaten bir sayı tipi mi yoksa bir işlem dizisi mi oldupunu anlayabilirsin.
strtoint ve strtointdef yerine strtofloat ve strtofloatdef kullanabilisin.
Kullanıcı avatarı
haydarxxx
Üye
Mesajlar: 668
Kayıt: 09 May 2005 11:31
Konum: izmir

Mesaj gönderen haydarxxx »

Hocam uyarılarınız ve yardımlarınız için çok teşekkür ediyorum.Sağolun
Cevapla