Python-CookBook:42、对数值做格式化输出

本贴最后更新于 1941 天前,其中的信息可能已经事过境迁

 问题

我们需要对数值做格式化输出,包括控制位数、对齐、包含千位分隔符以及其他一些细节。

 解决方案

要对一个单独的数值做格式化输出,使用内建的 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()方法,这种方法就显得不是那么强大了。比如说,当使用 % 操作符来格式化数值时,有些功能就没法得到支持了(例如添加千位分隔符)。

  • Python

    Python 是一种面向对象、直译式电脑编程语言,具有近二十年的发展历史,成熟且稳定。它包含了一组完善而且容易理解的标准库,能够轻松完成很多常见的任务。它的语法简捷和清晰,尽量使用无异义的英语单词,与其它大多数程序设计语言使用大括号不一样,它使用缩进来定义语句块。

    545 引用 • 672 回帖
  • 书籍

    宋真宗赵恒曾经说过:“书中自有黄金屋,书中自有颜如玉。”

    78 引用 • 391 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...