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

```
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**[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 <Enter> 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**.

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