6

'nan'floatでstring.formatを使用しようとしています。

Pythonドキュメントの「g」オプションの説明は次のとおりです。

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

そして、これが私がインタープリター(Python 2.6)で試してみたものです:

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

ドキュメントを理解しているので、出力は「nan」である必要があります。

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

4

1 に答える 1

8

repr(float)Python2.6およびPython3.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'
于 2012-08-07T15:32:11.117 に答える