2012-08-07 79 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