2014-10-03 104 views
0

我意识到这个问题可以理解为类似于别人,所以我开始之前,这里是一些可能的“重复”列表中每个人都开始指向之前出。这些似乎都没有正确回答我的问题。Python字符串格式化{:d} VS%d的浮点数

我的问题特别涉及使用用于显示的整数的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

如果你不知道你的变量是否是一个整数,那么不仅要明确地进行转换,这是什么原因?例如'print'{:d}“。format(int(1.2345))' – 2014-10-03 09:39:23

+0

@Tom,正如我所说的,我可以自己完成转换,所有的麻烦都会消失。但是我真正想知道的是,为什么两种乍看之下非常相似的方法并没有完全一样。 – Mike 2014-10-03 09:45:17

回答

8

两个实现是相当独立的,并在%执行一些疣冰释前嫌。对于花车使用%d可能掩盖在你的代码,你以为你有整数,但得到的浮点值而不是问题。想象的1.999999的值,并且只看到1而不是2作为%d截断值。

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

可以使用{:.0f}格式不带小数的数字显示明确(四舍五入)浮点值:

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

或格式化明确截断之前你的浮点数使用int()

作为一个侧面说明,如果你正在做的是格式化数字作为一个字符串(而不是插值成一个较大的字符串),使用format() function

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

这传达你的意图更好,启动要快一点。

+0

谢谢,很好的解释!这就是我真正的追求。 +1 – Mike 2014-10-03 09:42:45

0

有关于“自动类型转换”(胁迫)2.7和3.0之间的一个重要的变化。虽然2.7在某种程度上相对“放松”,但3.0强迫你更加自律。

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

但是,新的string.format()添加了一些非常强大和有用的格式化技术。 “免费”格式“{}”甚至非常清楚。像这样:

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

请参阅?我不需要指定'整数','浮动'或其他任何东西。这将适用于任何类型的值。

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

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