2012-11-26 9 views
5

非常に簡単です:Haskellで指数形式で書かれた整数を読むには?進形式で書かれた整数を読み取ること

Prelude> read "1000000000" :: Int 
1000000000 

しかし、どのようexponetial形式で書かれた整数を読み取るために?

Prelude> read "10e+9" :: Int 
*** Exception: Prelude.read: no parse 

それをするPreludeでの機能があり、または私達は式を解析する必要がありますか?

ご回答ありがとうございます。

+2

'Prelude'の中には、あなた自身のパーサを書く必要はありません。 –

+0

あなたの例はghc 7.0.4を使用して私のために働きます(あふれていますが)。 – dave4420

+3

@ dave4420 ghc> = 7.4では動作しません。その前に、報告書によると、iircのいずれかで働いてはいけません。 –

答えて

2

文字列の正確な形式に応じて、あなただけのreadそれ浮動小数点型への可能性:

> read "10e+9" :: Double 
1.0e10 

then convert to an integral type - 私の代わりにIntIntegerをお勧めします:

> floor (read "10e+9" :: Double) :: Integer 
10000000000 
+0

'Prelude> floor 10e78 ==> 9999999999999999676607006595519222746403606649979932326024618633003221909504' –

+0

@will' ghci> 10e780'、 'ghci> floor 10e780'は浮動小数点数が大好きです。 –

+0

いくつかのエンジニアリングソフトウェアが生成する "5.e-003"の読み込みに失敗します。 – CMCDragonkai

3

パーサーはこちら

readI xs = let (m,e) = break (=='e') xs in 
    read m * 10^case e of 
     "" -> 1 
     ('e':'+':p) -> read p 
     ('e':p) -> read p 

与える

Main> readI "3e5" 
300000 
Main> readI "3e+500" 
300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 
Main> readI "3e+500" :: Int 
0 
Main> readI "3e+500" :: Integer 
300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 

、我々はそれが整数の答えを与えるが、それが読取り機能のためにやり過ぎだろう負の指数に対処するために試みることができるも

Main> readI "32e-5" 
Program error: Prelude.^: negative exponent 

関連する問題