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

时间:2014-10-03 09:36:20

标签: python string string-formatting

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

我的问题特别涉及使用string.format()方法显示整数。

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

    >>> print "%d" %(1.2345)  
    1

使用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'

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

2 个答案:

答案 0 :(得分:9)

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

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

您可以使用{:.0f}格式显式显示(舍入)浮点值,不带小数:

>>> '{:.0f}'.format(1.234)
'1'
>>> '{:.0f}'.format(1.534)
'2'

或在格式化之前使用int()以明确截断您的浮点数。

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

>>> format(1.234, '.0f')
'1'

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

答案 1 :(得分:0)

关于&#34;自动类型转换&#34;在2.7和3.0之间有一个重要的变化。 (强迫)。虽然2.7在某种程度上是相对的&#34;放松&#34;关于这一点,3.0迫使你更加自律。

自动转换可能很危险,因为它可能会无声地截断/减少某些数据!此外,这种行为是不一致的,你永远不知道会发生什么;直到你面对他的问题。 Python 3.0要求您准确地指定您想要的内容!

但是,新的string.format()添加了一些非常强大且有用的格式化技术。对于&#34; free&#34;它甚至非常清楚。格式&#39; {}&#39;。像这样:

'{}'.format(234)
'{:10}.format(234)
'{:<10}'.format(234)

看?我没有必要指定&#39;整数&#39;,&#39; float&#39;或其他任何东西。这适用于任何类型的值。

for v in (234, 1.234, 'toto'):
    for fmt in ('[{}]', '[{:10}]', '[{:<10d}]', '[{:>10d}]'):
        print(fmt.format(v))

此外,%值已过时,不应再使用。新的string.format()更易于使用,并且具有比旧格式化技术更多的功能。其中,恕我直言,使旧技术的吸引力降低。