快速明白:
some_float = 1234.5678
print '%02d' % some_float # 1234
some_float = 1234.5678
print '{WHAT?}'.format(some_float) # I want 1234 here too
注意:{:.0f}
不是一个选项,因为它会舍入(在此示例中返回1235
)。
format(..., int(some_float))
正是我想要避免的,请不要暗示。
答案 0 :(得分:14)
可以通过扩展类string.Formatter来扩展标准字符串格式化语言:
class MyFormatter(Formatter):
def format_field(self, value, format_spec):
if format_spec == 't': # Truncate and render as int
return str(int(value))
return super(MyFormatter, self).format_field(value, format_spec)
MyFormatter().format("{0} {1:t}", "Hello", 4.567) # returns "Hello 4"
答案 1 :(得分:13)
这有效:
from math import trunc
some_float = 1234.5678
print '{:d}'.format(trunc(some_float))
=> 1234
或者只是这样做:
print trunc(some_float)
=> 1234
我认为这是一个可以接受的答案,它避免了转换为int
。请注意,在此代码段中:'%02d' % some_float
隐式转换为int
,您无法避免以所需格式进行某种转换。
答案 2 :(得分:2)
值得一提的是如何使用原始格式字符串呈现浮点数的内置行为。如果您事先知道小数部分相对于0.5的位置,则可以利用您最初尝试的格式字符串,但是发现由于舍入副作用"{:0.0f}"
而导致格式字符串不足。查看以下示例...
>>> "{:0.0f}".format(1.33)
'1'
>>> "{:0.0f}".format(1.500)
'2'
>>> "{:0.0f}".format(1.53)
'2'
>>> "{:0.0f}".format(1.999)
'2'
>>> "{:0.0f}".format(0.501)
'1'
>>> "{:0.0f}".format(0.5)
'0'
>>> "{:0.0f}".format(0.1)
'0'
>>> "{:0.0f}".format(0.001)
'0'
如您所见,幕后有四舍五入行为。在我有一个将int转换为float的数据库的情况下,我知道我事先要处理一个非小数部分,并且只想在html模板中呈现float的int部分作为一种解决方法。当然,如果您事先不知道小数部分,则需要先在浮点数上执行某种截断操作。
答案 3 :(得分:-9)
这也可以:
some_float = 1234.5678
f = lambda x: str(x)[:str(x).find('.')]
print '{}'.format(f(some_float))
=> 1234
在进行%timeit测试之后,看起来数学库中的trunc函数更快,因此如果您需要以这种方式格式化多个数字,则首选math.trunc
。