Below is a function I'm using in a program I'm writing. What it will do is take a given string in the form 1-1/2 and convert it from a mixed number into a floating point number. (e.g. 1-1/2 to 1.5) I was wondering if there was a better way to implement it than the way I have below. (It's ugly, but it works.) The program is being written in Delphi 1.02 (but Pascal is Pascal, no matter how one looks at it. :-) I'd much rather force people to just input a friggin' decimal, unfortunately, the databases are old and have already been saved. Anyway, code snippet to follow. Begin function FracToFloat(Incoming : string): Single; var i : integer; begin Incoming := Trim(Incoming); i := Pos('-',Incoming); if i = 0 then begin try Result := StrToFloat(Incoming); except on EConvertError do Result := 0.0; end; exit; end; Result := StrToFloat(Copy(Incoming,1,i-1)); Incoming := Copy(Incoming,i+1,Length(Incoming)-i); i := Pos('/',Incoming); Result := Result + StrToInt(Copy(Incoming,1,i-1))/ StrToInt(Copy(Incoming,i+1,Length(Incoming)-i)); end; End BTW, the Trim function (in the first line of the proc body) is my own creation for Delphi. It yanks out ALL spaces, not just leading/trailing. Program FractionalStrings; { written in Turbo v.6.0 Nov 3, 1996 Accepts string input of the form 5-3/4 and converts to a floating point number. However, ' ab cd.xx5nmjk---3 xxx///cc 4 ***' will be cleaned up to show 5-3/4 = 5.75000, also. Will not convert negative numbers as written but is trivial to change. } VAR s:String; p1, p2:Byte; proper:Boolean; Function FracToFloat(Incoming:String):Single; VAR frag:Array[1..3] of String[10]; NumVal:Array[1..3] of Byte; p, indx:Byte; code:Integer; (* required for VAL *) (* may be used for error checking *) Begin Incoming := Incoming + ' '; (* for convenience *) (* remove non-numeric leading chars including spaces *) While Not (Incoming[1] in ['0'..'9']) Do Delete(Incoming, 1, 1); p := 1; For indx := 1 to 3 Do Begin frag[indx] := ''; While Incoming[p] in ['0'..'9'] do Begin frag[indx] := frag[indx] + Incoming[p]; Inc(p); End; VAL(frag[indx], NumVal[indx], code); If indx < 3 then (* skip non-numeric *) While Not(Incoming[p] in ['0'..'9']) Do Inc(p); End; (* show cleaned input *) Write(frag[1], '-', frag[2], '/', frag[3], ' = ' ); FracToFloat := NumVal[1] + NumVal[2] / NumVal[3]; End; Begin Writeln; Writeln; Writeln('Just press to quit'); Repeat Repeat Writeln; Write('Enter a mixed fraction such as 5-3/4: '); Readln(s); If Length(s) = 0 then exit; p1 := Pos('-', s); p2 := Pos('/', s); proper := (p1 > 0) AND (p2 > p1); If not proper then Write(Chr(7)); (* beep *) Until proper; Writeln(FracToFloat(s):10:5); Until Length(s) = 0; End.