# [Haskell-cafe] Re: Proper round-trip HughesPJ/Parsec for Doubles?

Tue Feb 23 11:08:29 EST 2010

```>> Short version: How can I pretty print and parse values of type Double
>> such that those operations are each other's inverse?
>
> Maybe you have more luck with show and read (without Parsec.Token).
>
> x = 9.91165677454629
>
> fails because the computation performed by the parser
> 9.0 + 0.91165677454629 yields 9.911656774546291

That seems to do the trick!  Below, for the record, the code I've come
up with (I threw away the Either Integer Double part so it's a bit
simpler, also).  I'm sure it can be improved, but this is passing all
tests reliably, it seems.

Many thanks, Christian and Daniel, for your help!

Best,

-Andy

parseDouble :: Parser Double
parseDouble = try \$ do (symbol toks) "-"
n <- floater
return \$ negate n
<|> floater
where toks = makeTokenParser emptyDef

-- This could definitely be improved, but it's working. :-)
floater :: Parser Double
floater = do w <- many1 digit
char '.'
f <- many1 digit
e <- optionMaybe \$ do char 'e' -- Optional exponent part
n <- option "" (char '-' >> return
"-") -- Optional negation in exponent
m <- many1 digit
return \$ n ++ m
case e of Nothing -> return \$ read \$ w ++ "." ++ f
Just e' -> return \$ read \$ w ++ "." ++ f ++
"e" ++ e'

--
Andy Gimblett
http://gimbo.org.uk/

```