String değeri hesaplayarak İnteger'e Çevirme
Forum kuralları
Forum kurallarını okuyup, uyunuz!
Forum kurallarını okuyup, uyunuz!
String değeri hesaplayarak İnteger'e Çevirme
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
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
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.
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
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
Arkadaşlar güzel açıklamışsınız teşekkürler ama bir örnek kod da yazsanız çok makbule geçerdi
integer ifadesi yanlış olmuş
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
haklısınız.teşekkür ediyorum ama bir örnek kod da bekliyorum.sağolun

integer ifadesi yanlış olmuş


Aceleyle senin için bi kod yazdım
Denedim çalışıyor

Ama işlem sırasını göz önünde tutmuyor.
Umarım işine yarar.
Formun Şekli
Alt İşlem Yapan Fonksiyon
Asıl işlemi yapan karar verici fonksiyon
Kullanımı

Denedim çalışıyor


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}
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;
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;
Kod: Tümünü seç
procedure TForm1.Button1Click(Sender: TObject);
begin
showmessage(floattostr(stringislem(edit1.Text)));
end;
Kod: Tümünü seç
end.

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
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.
problemsiz çalışıyor elinize sağlık bir proje olarak denedim buradan kendi projeme uyarlayacağım yanlız şöyle bir sorun var

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.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![]()
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.
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.
hocam şu kodla sorunu çözebiliyoruz belki ama
yanlız bu fonksiyonu ben şöyle bir işlem içinde kullanacağım haliyle tam sayı olduğunda bu işlemi yapamayacak
ne olduğunu çıkaramadım 
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

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.

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
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 diyebilirsin.
hesaplama için Filed'a AsCurrency olarak, benim verdiğim fonksiyonda kullanacağın Field'a da AsString olarak davranmayı dene.
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.
ş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.
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.
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
hesaplama için Filed'a AsCurrency olarak, benim verdiğim fonksiyonda kullanacağın Field'a da AsString olarak davranmayı dene.
ifadesinde demek istediğim.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.
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)
strtoint ve strtointdef yerine strtofloat ve strtofloatdef kullanabilisin.