问题
我们需要对数值做格式化输出,包括控制位数、对齐、包含千位分隔符以及其他一些细节。
解决方案
要对一个单独的数值做格式化输出,使用内建的 format()函数即可。示例如下:
>>> x = 1234.56789
>>> # Two decimal places of accuracy
>>> format(x, '0.2f')
'1234.57'
>>> # Right justified in 10 chars, one-digit accuracy
>>> format(x, '>10.1f')
' 1234.6'
>>> # Left justified
>>> format(x, '<10.1f')
'1234.6 '
>>> # Centered
>>> format(x, '^10.1f')
' 1234.6 '
>>> # Inclusion of thousands separator
>>> format(x, ',')
'1,234.56789'
>>> format(x, '0,.1f')
'1,234.6'
>>>
如果想采用科学计数法,只要把 f 改为 e 或者 E 即可,根据希望采用的指数规格来指定。示例如下:
>>> format(x, 'e')
'1.234568e+03'
>>> format(x, '0.2E')
'1.23E+03'
>>>
以上两种情况中,指定宽度和精度的一般格式为'[<>^]?width[,]?(.digits)?',这里 width 和 digits 为整数,而?代表可选的部分。同样的格式也可用于字符串的.format()方法中。示例如下:
>>> 'The value is {:0,.2f}'.format(x)
'The value is 1,234.57'
>>>
讨论
对数值做格式化输出通常都是很直接的。本节展示的技术既能用于浮点型数,也能适用于 decimal 模块中的 Decimal 对象。
当需要限制数值的位数时,数值会根据 round()函数的规则来进行取整。示例如下:
>>> x
1234.56789
>>> format(x, '0.1f')
'1234.6'
>>> format(-x, '0.1f')
'-1234.6'
>>>
对数值加上千位分隔符的格式化操作并不是特定于本地环境的。如果需要将这个需求纳入考虑,应该考察一下 local 模块中的函数。还可以利用字符串的 translate()方法交换不同的分隔字符。示例如下:
>>> swap_separators = { ord('.'):',', ord(','):'.' }
>>> format(x, ',').translate(swap_separators)
'1.234,56789'
>>>
在很多 Python 代码中,常用 % 操作符来对数值做格式化处理。示例如下:
>>> '%0.2f' % x
'1234.57'
>>> '%10.1f' % x
' 1234.6'
>>> '%-10.1f' % x
'1234.6 '
>>>
这种格式化操作仍然是可接受的,但是比起更加现代化的 format()方法,这种方法就显得不是那么强大了。比如说,当使用 % 操作符来格式化数值时,有些功能就没法得到支持了(例如添加千位分隔符)。
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于