python字符串格式化{:d} vs%d浮点数

Mik*_*ike 2 python string string-formatting

我意识到这个问题可以被解释为与其他问题类似,所以在我开始之前,这里列出了一些可能的"重复",然后每个人都开始指出它们.这些似乎都不能正确回答我的问题.

我的问题特别适用于使用string.format()方法显示整数.

在运行python 2.7的解释器中使用%字符串格式运行以下代码

    >>> print "%d" %(1.2345)  
    1
Run Code Online (Sandbox Code Playgroud)

而使用string.format()方法会产生以下结果

    >>> print "{:d}".format(1.2345)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    ValueError: Unknown format code 'd' for object type 'float'
Run Code Online (Sandbox Code Playgroud)

我期待两者都有同样的行为; 解释器在显示之前实际将我的浮点数转换为整数.我意识到我可以使用int函数将浮点数转换为整数格式,但我正在寻找与%d格式化方法相同的功能.是否有任何string.format()方法可以帮我吗?

Mar*_*ers 10

这两个实现是完全分开的,实现中的一些瑕疵%被解决了.使用%d浮点数可能会掩盖代码中的问题,您认为自己有整数,但却得到了浮点值.想象一个值,1.999999并且只看到1而不是2来%d截断值.

因此,执行实际转换工作所float.__format__()调用的钩子方法str.format()不支持d格式,而是抛出异常.

您可以使用该{:.0f}格式显式显示(舍入)没有十进制数的浮点值:

>>> '{:.0f}'.format(1.234)
'1'
>>> '{:.0f}'.format(1.534)
'2'
Run Code Online (Sandbox Code Playgroud)

int()在格式化之前使用以显式截断浮点数.

作为旁注,如果您要做的只是将数字格式化为字符串(而不是插入更大的字符串),请使用以下format()函数:

>>> format(1.234, '.0f')
'1'
Run Code Online (Sandbox Code Playgroud)

这可以更好地传达您的意图,并且启动速度更快.