以前に作った実数値を読むパーサですが、これを使って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 件のコメント:
コメントを投稿