let convert r =
let e = {
mantiss = Buffer.create 64 ; sign = Positive ;
exponent = Buffer.create 64 ;
coma = 0 ; state = Integral ;
} in
String.iter
(fun c ->
let tk = token c in
match e.state , tk with
| _ , Dot -> e.state <- Fraction ;
| _ , Exp -> e.state <- Exponent ;
| (Integral|Fraction) , Plus -> e.sign <- Positive
| (Integral|Fraction) , Minus -> e.sign <- Negative
| Integral , Digit -> Buffer.add_char e.mantiss c
| Fraction , Digit -> Buffer.add_char e.mantiss c ; e.coma <- succ e.coma
| Exponent , (Plus|Minus|Digit) -> Buffer.add_char e.exponent c
) r ;
let m = Buffer.contents e.mantiss in
begin
match trail m with
| None -> "0"
| Some(a,b) ->
let digits = String.sub m a (String.length m - a - b) in
let exp =
let ex = Buffer.contents e.exponent in
if ex = "" then b - e.coma else int_of_string ex + b - e.coma
in
let size = 4 + String.length m + abs exp in
let buffer = Buffer.create size in
let parent = e.sign = Negative || exp <> 0 in
if parent then Buffer.add_char buffer '(' ;
if e.sign = Negative then Buffer.add_char buffer '-' ;
Buffer.add_string buffer digits ;
if exp > 0 then Buffer.add_string buffer (String.make exp '0') ;
if exp < 0 then
(Buffer.add_string buffer "/1" ;
Buffer.add_string buffer (String.make (-exp) '0')) ;
if parent then Buffer.add_char buffer ')' ;
Buffer.contents buffer
end