2012-08-07 73 views
5

我想在'nan'浮點數上使用string.format。在python中格式化一個nan浮點數

以下是python documentation中'g'選項的說明。

通用格式。這將打印數字作爲定點數字,除非數字太大,在這種情況下,它會切換爲'e'指數表示法。 Infinity和NaN值的格式分別爲inf,-inf和nan。

這裏就是我在嘗試它在解釋器(Python 2.6中):

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

據我瞭解的文件,輸出應該是「男」。

這是一個錯誤還是我做錯了?

+0

什麼平臺,您使用的是哪個版本的Python? – ecatmur 2012-08-07 15:30:16

+1

平臺的Windows 7和Python v 2.6.6(32位) – Chris 2012-08-07 15:33:14

回答

7

repr(float)在Python 2.6和Python 3.0中修復;見http://bugs.python.org/issue1635;然而str.format直到2.7分支才被修復;見http://hg.python.org/cpython/rev/c5e0d9beebf9http://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 2012-08-07 15:37:29

+0

錯誤中列出的「版本」報告是發現它的版本,還是修復了它的版本?我懷疑前者。它適用於我2.7。 – 2012-08-07 16:20:56

+0

@Chris它看起來像'str.format'是一個單獨的修復程序。 – ecatmur 2012-08-07 17:04:32