火曜日, 11月 18, 2008

Haskellを使ってみる (5)

以前に作った実数値を読むパーサですが、これを使ってcairoで絵を描かせてみたら、小数点の直ぐ下に"0"が並んでいると無視される酷いバグが! orz

realNum :: Parser Double realNum = do sign <- option 1 (do s <- oneOf "+-"                                   return \$ if s=='-' then -1 else 1)              int   <- option 0 cntNum              option '.' (char '.')              zeros <- many (char '0')              frac  <- option 0 cntNum              exp   <- option 0 (do oneOf "eEdD"                                    e <- intNum                                    return \$ e)              return \$ (fromIntegral sign) *                         (fromIntegral int +                          (toFrac (fromIntegral frac) (length zeros))) *                           (10**(fromIntegral exp))           where             toFrac n m = if n<1 then                              if m<=0 then n                              else toFrac (n/10) (m-1)                          else toFrac (n/10) m cntNum :: Parser Int cntNum = do n <- many1 digit             return \$ (read n :: Int) intNum :: Parser Int intNum = do sign <- option 1 (do s <- oneOf "+-"                                  return \$ if s=='-' then -1 else 1)             num   <- many digit             return \$ sign * (read num)

小数点直下の"0"の数を数えて、その分だけ小数点以下の数を10で割るように修正。これでいいはず。やっぱりデータを視覚化すると一発だな orz

0 件のコメント: