2012-08-07 16 views
5

私は 'nan' floatでstring.formatを使用しようとしています。PythonでのN浮動小数点のフォーマット

python documentationの 'g'オプションの説明は次のとおりです。

一般的な形式。これは、数値が大きすぎる場合を除いて、固定小数点数として数字を出力します。数字が大きすぎる場合は、 'e'指数表記に切り替わります。 InfinityとNaNの値は、それぞれinf、-inf、nanと書式設定されます。

そして、ここで私は通訳(Pythonの2.6)でそれをしようとして得るものです:

>>> print "{0:g}".format(float('nan')) 
-1.#IND 

私はドキュメントを理解し、出力は「ナン」でなければなりません。

これはバグですか?それとも間違っていますか?

+0

何プラットフォームと、使用しているのPythonのバージョンを? – ecatmur

+1

プラットフォームのWindows 7とPython v。2.6.6(32ビット) – Chris

答えて

7

repr(float)は、Python 2.6およびPython 3.0で修正されました。 http://bugs.python.org/issue1635を参照してください。しかし、str.formatは2.7ブランチまで固定されませんでした。 http://hg.python.org/cpython/rev/c5e0d9beebf9およびhttp://bugs.python.org/issue1580を参照してください。

"{0!r}"があなたに役立つかどうかを確認することをおすすめします。そのは、破損していないreprコードに電話する必要があります。

あなたは"{0:g}"フォーマットの仕様を使用する必要がある場合、あなたはfloatとオーバーライド__format__サブクラス化を試みることができる:

class FixFloat(float): 
    def __format__(self, format_spec): 
     return 'nan' if math.isnan(self) else float.__format__(self, format_spec) 

"{0:g}".format(FixFloat(1.2345e9)) 
'1.2345e+09' 
"{0:g}".format(FixFloat(float('nan'))) 
'nan' 
+0

私はPython 2.6を使用しています。あなたの答えをもう少し発展させたいですか? – Chris

+0

バグに記載されている 'Versions'は、発見されたバージョン、または修正されたバージョンを報告していますか?私は前者と思われる。それは2.7で私のために働く。 –

+0

@Chris 'str.format'は別の修正プログラムだったようです。 – ecatmur

関連する問題