我意识到这个问题可以被解释为与其他人类似,所以在我开始之前,这里列出了一些可能的"重复"在每个人开始指出它们之前。这些似乎都不能正确回答我的问题。
我的问题特别涉及使用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()方法可以为我执行此操作?
答案 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()更易于使用,并且具有比旧格式化技术更多的功能。其中,恕我直言,使旧技术的吸引力降低。