一个简单易懂的决策:
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.5的位置,则可以利用最初尝试但因四舍五入效应而未能实现的格式字符串"{:0.0f}"
。请查看以下示例...
>>> "{:0.0f}".format(1.999)
'2'
>>> "{:0.0f}".format(1.53)
'2'
>>> "{:0.0f}".format(1.500)
'2'
>>> "{:0.0f}".format(1.33)
'1'
>>> "{:0.0f}".format(0.501)
'1'
>>> "{:0.0f}".format(0.5)
'0'
>>> "{:0.0f}".format(0.1)
'0'
>>> "{:0.0f}".format(0.001)
'0'
正如您所看到的,背后有舍入行为。在我的情况下,我知道我要处理的是一个非分数部分,只想将浮点数的整数部分呈现在html模板中作为解决方法。当然,如果您不事先知道小数部分,则需要首先对浮点数执行截断操作。
通过扩展类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"
这个有效:
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
,你无法避免某种形式的转换以按所需格式打印。
这也可以工作:
some_float = 1234.5678
f = lambda x: str(x)[:str(x).find('.')]
print '{}'.format(f(some_float))
=> 1234
经过进行%timeit测试,看起来这比截断方法要快一些。
.0
)?当然,与其他答案中提出的解决方案相比,这仍然是一个糟糕的解决方案。 - Markus von Broady
"{:.0f}".format(1234.5678)
的结果是"1235"
而不是"1234"
。 - Blckknghtint()
或截断它是唯一的选项怎么办?下一步是创建一个自定义的float()
子类来自定义.__format__()
钩子。 - Martijn Pieters'%02d' % some_float
,隐式转换为int
正在发生,你无法避免某种形式的转换以打印所需的格式。 - Óscar López{some_var:d}
能够正常工作而不需要额外的转换。 - georg