将截断的Python float格式化为string中的int

geo*_*org 23 python format

快速简单:

some_float = 1234.5678
print '%02d' % some_float  # 1234

some_float = 1234.5678
print '{WHAT?}'.format(some_float) # I want 1234 here too
Run Code Online (Sandbox Code Playgroud)

注意:{:.0f}不是一个选项,因为它会舍入(1235在此示例中返回).

format(..., int(some_float)) 正是我想避免的事情,请不要这么做.

ber*_*eal 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"
Run Code Online (Sandbox Code Playgroud)


Ósc*_*pez 13

这有效:

from math import trunc
some_float = 1234.5678

print '{:d}'.format(trunc(some_float))
=> 1234
Run Code Online (Sandbox Code Playgroud)

或者就这样做,就此而言:

print trunc(some_float)
=> 1234
Run Code Online (Sandbox Code Playgroud)

我认为这是一个可以接受的答案,它避免了转换为int.请注意,在此片段中:'%02d' % some_float正在进行隐式转换int,您无法避免某种转换以所需格式进行打印.


jxr*_*mos 5

值得一提的是如何使用原始格式字符串呈现浮点数的内置行为。如果您事先知道小数部分相对于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'
Run Code Online (Sandbox Code Playgroud)

如您所见,幕后有四舍五入行为。在我有一个将int转换为float的数据库的情况下,我知道我事先要处理一个非小数部分,并且只想在html模板中呈现float的int部分作为一种解决方法。当然,如果您事先不知道小数部分,则需要首先在浮点数上执行某种截断操作。