``````
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  <clifpenn@airmail.net>  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;
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 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, '-', frag, '/', frag, ' = ' );
FracToFloat := NumVal + NumVal / NumVal;
End;

Begin
Writeln; Writeln;
Writeln('Just press <Enter> to quit');
Repeat

Repeat
Writeln;
Write('Enter a mixed fraction such as 5-3/4: ');
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.

``````

[Back to MATH SWAG index]  [Back to Main SWAG index]  [Original]