// Ovaj primer je odradio Milan Milosevic Milan2000yu@yahoo.com unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; const Jeste_Broj =0; type //Tip Podatka koji sadrzi sve informacije koje treba da znamo TFloatString = record // -12.45 e - 23 Znak:byte;//0 za + ,1,a - Broj:string;// po default ='0'; PolozajTacke:Cardinal;// po default 2 za 1- .1232444 PolozajE:Cardinal;// po default 3 ZnakUExp:Byte;//0 za + ,1,a - // po defoltu 0 x10:String;// po default ='0'; end; TForm1 = class(TForm) Button1: TButton; Edit1: TEdit; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; Function StringBezBlanko(String1:String):string;//funkcija koja uklanja blanko praznine u stringu '1 2 21 7' = '12217' Function StringUFloat(UlazBroj:String;var FloatString:TFloatString ):Word;//Procedura koja obican string prebacuje u TFloatString Procedure SrediE(var FloatString:TFloatString); var Form1: TForm1; implementation {$R *.dfm} Procedure SrediE(var FloatString:TFloatString); var Duzina:Cardinal; begin Duzina:=Length(FloatString.Broj)+1; If Duzina<>FloatString.PolozajTacke then //Sredivanje polozajaE FloatString.PolozajE:=Length(FloatString.Broj)+1 else FloatString.PolozajE:=Length(FloatString.Broj)+2; end; Function StringBezBlanko(String1:String):string; var L,StavrnaDuz:Cardinal; PUlaz,PResult:PChar; Rez:String;//U slucaju da dodeljujemo vrednost samom sebi korisiomo ga koao result begin L:=Length(String1); SetLength(Result,L); SetLength(Rez,L); PUlaz:=PChar(String1); PResult:=PChar(Rez); StavrnaDuz:=0; asm PUSH ESI PUSH EDI PUSH EAX PUSH EBX MOV EDI,PResult //Pokazivac na izlazni string MOV EBX,L //Brojac U For Petlju MOV ESI,PUlaz @@Pocetak: CMP EBX,0 JE @@Kraj MOV AL,[ESI] CMP AL,32 JE @@Nastavak INC StavrnaDuz MOV [EDI],AL INC EDI @@Nastavak:INC ESI // DEC EBX JMP @@Pocetak @@Kraj: POP EBX POP EAX POP EDI POP ESI end; Result:=Copy(Rez,1,StavrnaDuz); end; // unkcija vraca 0-uredu , 1-u stringu postoji ne broj ne tacka ne e ili E,2 - postoje 2 ili vise tacaka 3- postoje 2 ili vise e 4 Function StringUFloat(UlazBroj:String;var FloatString:TFloatString):Word; var L,PolozajTacke,PolozajE: Integer; PUlazBroj:PChar;//pokazivac na Ulazni string Tacka,E,PosZnak:Byte; PosEZnak:Byte;// 0 ne postoji ,1 - postoji (+ ili -) begin UlazBroj:=StringBezBlanko(UlazBroj);//eliminisemo blanko izmedu brojeva L := Length(UlazBroj); if L<>0 then Begin PosZnak:=0;//pretpostavimo da ne postoji znak FloatString.Znak:=0;// Pretpostavimo da ako ne postoji tada je + If (UlazBroj[1]='+') then PosZnak:=1; // Ako postoji tada moramo da ga uracunamo If(UlazBroj[1]='-') then begin FloatString.Znak:=1; PosZnak:=1; end; Result:=0;//Pretpostavimo da je resenje tacno Tacka:=0;//Pretpostavimo da tacka nema E:=0;//Pretpostavimo da E nema PUlazBroj:=PChar(UlazBroj); // FloatString.Broj:='0'; PolozajTacke:=0; PolozajE:=0; asm PUSH ESI PUSH EBX PUSH EAX PUSH ECX //telo MOV ESI,PUlazBroj MOV EBX,1 // i uzima vrednost 0 EBX je ustvari I MOV ECX,[L] //ima znak CMP PosZnak,0 JE @@1 INC ESI INC EBX @@1: INC ECX //L @@IFOR: CMP EBX,ECX JE @@kraj //Begin MOV AL,[ESI]//Ubacujemo I-ti bajt u AL za proveru //BEGIN if <48 CMP AL,48 JGE @@VECE //Ukoliko je manje od 48 (0) tada vrsi naredni kod a ako nije tada idi na @@VECE CMP AL,46 //Proveravamo dali je tacka JE @@Tac //ako nije tacka MOV Result,1// Greska_Nije_Broj JMP @@kraj //Ako nije tacka tada je greska 1 //Ako jeste tacka @@Tac: CMP Tacka,0;// proveravamo dali je vec bila tacka JE @@ITAC // ako je nula tada je prva tacka //Ako nije prva tacka MOV Result,2// Greska_Vise_od_1_tacke JMP @@kraj //Ako nije tacka tada je greska 2 //Ako je prva tacka @@ITAC: //Proverimo dali vec upisano E CMP E,0 JE @@PRVA_TAC //Ako pre toga nije upisano E MOV Result,4// Greska_Tacka_posle_E JMP @@kraj @@PRVA_TAC:MOV PolozajTacke,EBX // Postvanjamo da je to polozaj tacke MOV Tacka,1 //Ovim dajemo da je tacka prosla JMP @@ENDIF48 // Ukoliko je vece od 48 @@VECE: CMP AL,57 JG @@DALI_JE_E JMP @@END_FOR_I // to jeste broj idemo dalje u For petlju @@DALI_JE_E: CMP AL,101 // dali je malo e JE @@DALI_JE_PRVO_E //Ako nije malo e treba da proverimo dali je veliko e CMP AL,69 //69 - E JE @@DALI_JE_PRVO_E //Nije ni veliko ni malo e MOV Result,1// Greska_Nije_Broj JMP @@kraj //Greska nema smisla dalja analiza @@DALI_JE_PRVO_E: CMP E,0//proveravamo dali je vec bilo e JE @@PRVO_E //ako nije prvo MOV Result,3 JMP @@kraj @@PRVO_E: MOV E,1 MOV PolozajE,EBX // proveravamo dali iza E postoji nesto u nizu i dakli ima svrhe da ga trazimo INC EBX // pomeramo I za j CMP EBX,ECX // ukoliko je kraj niza nema potrebe da citamo JE @@kraj // proveravamo dali iza e ima znak i koji je INC ESI // pomeramo niz za jedan MOV AL,[ESI]// Citamo clan niza CMP AL,43 // Proveravamo dali je + JE @@POSLEEPL CMP AL,45 // Proveravamo dali je - JE @@POSLEEMI // ako nije ni + ni - MOV PosEZnak,0 JMP @@VRATI // ako nije ni plus ni minus onda sve vracamo nazad @@POSLEEMI:MOV PosEZnak,1 JMP @@ENDIF48 @@POSLEEPL:MOV PosEZnak,1 MOV FloatString.ZnakUExp,0 @@VRATI: DEC ESI// Vracamo Niz za 1 DEC EBX // Vraca I za 1 //kraj IF <48 @@ENDIF48: //End; @@END_FOR_I: INC EBX //Dodaje Na I :=I+1 INC ESI //S[I],pomeranje po stringu JMP @@IFOR //Vracamo se na pocetak for petlje @@kraj: POP ECX POP EAX POP EBX POP ESI end; FloatString.ZnakUExp :=PosEZnak; If Result = 0 then begin // Provera dali ima greska if PolozajE = 0 then begin FloatString.x10:='0'; if PolozajTacke <> 0 then begin FloatString.Broj:=copy(UlazBroj,PosZnak+1,PolozajTacke-1-PosZnak); FloatString.Broj:=FloatString.Broj+copy(UlazBroj,PolozajTacke+1,L); FloatString.PolozajTacke:=PolozajTacke-PosZnak; end else begin FloatString.Broj:=copy(UlazBroj,1+PosZnak,L); FloatString.PolozajTacke:=L+1-PosZnak; end; end else begin if PolozajTacke <> 0 then begin FloatString.Broj:=copy(UlazBroj,PosZnak+1,PolozajTacke-1-PosZnak); FloatString.Broj:=FloatString.Broj+copy(UlazBroj,PolozajTacke+1,PolozajE-1-PosZnak); Delete(FloatString.Broj,PolozajE-1-PosZnak,L-PolozajE+1+PosZnak); FloatString.PolozajTacke:=PolozajTacke-PosZnak; end else begin FloatString.Broj:=copy(UlazBroj,PosZnak+1,PolozajE-1-PosZnak); FloatString.PolozajTacke:=Length(FloatString.Broj)+1; end; // Ukidanje Nelogicnih unosa preko kombinacije znakova +,-,.,e if (L-PolozajE-1)>=0 then FloatString.x10:=copy(UlazBroj,PolozajE+1+PosEZnak,L) else FloatString.x10:='0'; If PolozajE=1 then If L=1 then begin FloatString.Broj:='1'; FloatString.x10:='0'; FloatString.PolozajTacke:=2; end else begin FloatString.Broj:='1'; FloatString.PolozajTacke:=2; end; end; If ((PolozajTacke =1)and (L=1))or((PolozajTacke =1)and(PolozajE=2)) then Result:=1; If (PosZnak = 1) and (L=1) then Result:=1; If (PosZnak = 1) and (L=2)and(PolozajTacke<>0) then Result:=1; If (PosZnak = 1) and (L=2)and(PolozajE<>0) then Result:=1; If (PosZnak = 1) and (L=3)and(PolozajE<>0)and(PolozajTacke<>0) then Result:=1; // if FloatString.x10 = '' THEN FloatString.x10:='0'; end;// Provera dali ima greska end else Result:=1; SrediE(FloatString); end; procedure TForm1.Button1Click(Sender: TObject); var s:string; Fs:TFloatString; begin s:=Edit1.Text; if StringUFloat(s,Fs)=Jeste_Broj then ShowMessage('Broj')else ShowMessage('Nije Broj'); end; end.