如何使用字符串格式化同时显示前导零和精度为3?

47 投票
3 回答
30248 浏览
提问于 2025-04-16 03:30

我想把一个数字表示成总宽度为7,包括小数点,并且前面和后面都有零。比如,我想把“5”表示成“005.000”。看起来字符串格式化可以让我做到其中一个,但不能同时做到这两个。下面是我在Ipython中得到的输出,说明了我的问题:

In [1]: '%.3f'%5
Out[1]: '5.000'

In [2]: '%03.f'%5
Out[2]: '005'

In [3]: '%03.3f'%5
Out[3]: '5.000'

第1行和第2行的结果正是我所期待的。第3行却忽略了我想要前导零的要求。有什么想法吗?谢谢!

3 个回答

9

[编辑:哎,又被打败了]

'%07.3F'%5

第一个数字是整个字段的宽度。

16

我花了一点时间才搞明白怎么用@nosklo的方法,结合.format()来做嵌套的格式化。

因为我在其他地方找不到相关的例子,所以决定在这里分享一下。

使用"{}".format(a)的例子

Python 2

>>> a = 5
>>> print "{}".format('%07.3F' % a)
005.000
>>> print("{}".format('%07.3F' % a))
005.000

Python 3

这是更符合python3的方式,参考了官方文档,不过两种方式都能正常工作。

注意%:的区别,以及在python3中格式化的位置是不同的。

>>> a = 5
>>> print("{:07.3F}".format(a))
005.000
>>> a = 5
>>> print("Your Number is formatted: {:07.3F}".format(a))
Your Number is formatted: 005.000

使用"{}".format(a)的嵌套例子

接着把这个扩展到我的代码中,涉及到嵌套的.format()

print("{}: TimeElapsed: {} Seconds, Clicks: {} x {} "
      "= {} clicks.".format(_now(),
                            "{:07.3F}".format((end -
                                               start).total_seconds()),
                            clicks, _ + 1, ((_ + 1) * clicks),
                            )
      )

这样就能按照我想要的方式格式化所有内容。

结果

20180912_234006: TimeElapsed: 002.475 Seconds, Clicks: 25 + 50 = 75 clicks.

需要注意的重要事项:

  • @babbitt: 第一个数字是总的字段宽度。

  • @meawoppl: 这也包括负号!...

71

第一个数字是位数,包括小数点在内。

>>> '%07.3f' % 5
'005.000'

重要提示:小数点(.)和负号(-)也算在这个总数里。

撰写回答