如何在Python中使用可变数量的数字格式化数字?

89

假设我想显示数字123,其前面有可变数量的零。

例如,如果我想以5位数的形式显示它,则会使用digits = 5,得到:

00123
如果我想要显示它为6个数字,我可以设置 digits = 6,得到如下结果:
000123

我该如何在Python中实现这个?

7个回答

209

如果您要将其用于格式化字符串的format()方法中,该方法优于旧的样式''%格式化。

>>> 'One hundred and twenty three with three leading zeros {0:06}.'.format(123)
'One hundred and twenty three with three leading zeros 000123.'

请参见
http://docs.python.org/library/stdtypes.html#str.format
http://docs.python.org/library/string.html#formatstrings

这里有一个变宽度的示例

>>> '{num:0{width}}'.format(num=123, width=6)
'000123'

你甚至可以将填充字符指定为变量

>>> '{num:{fill}{width}}'.format(num=123, fill='0', width=6)
'000123'

5
提到新的格式化方法我点赞。尽管需要一些时间去适应,但我觉得新方法比老的“%”风格更加简洁,这对我来说感觉有些讽刺,因为过去我认为“%”风格是最干净的方法。 - Wayne Werner
8
未命名占位符也被支持(至少在Python 3.4中):"{:{}{}}".format(123, 0, 6) - CodeManX
3
@CoDEmanX 未命名的占位符在Python 2.7中也适用 - 感谢。 - fantabolous
6
在Python 3.6中引入了f-strings,现在可以在不需要.format的情况下访问先前定义的变量。只需在字符串前面加上“f”:f'{num:{fill}{width}}'。我已经添加了包含这些信息的答案。 - joelostblom

44

有一个字符串方法叫做zfill:

>>> '12344'.zfill(10)
0000012344

它将在字符串左侧填充零以使字符串长度为N(在此示例中为10)。


1
这正是我正在寻找的,我只需使用'123'.zfill(m)即可使用变量而不是预定数量的数字。 谢谢! - Eddy

28

在Python 3.6中引入了格式化字符串字面量(简称"f-strings"),现在可以使用更简洁的语法访问先前定义的变量:

>>> name = "Fred"
>>> f"He said his name is {name}."
'He said his name is Fred.'

约翰·拉鲁伊提供的示例可以写成:
In [1]: num=123
   ...: fill='0'
   ...: width=6
   ...: f'{num:{fill}{width}}'

Out[1]: '000123'

27
'%0*d' % (5, 123)

1
这对于更一般的情况也非常有用。这是旧的格式化样式,不是吗?旧的样式被淘汰了,真是遗憾。 - Eddy
%0*d 中的 * 是什么意思?我查看了 Python 文档,发现在 format_spec ::= [[fill]align][sign][#][0][width][,][.precision][type] 中并没有 * - SparkAndShine
4
最小字段宽度(可选)。如果指定为“*”(星号),实际宽度将从元组中下一个值读取,要转换的对象在最小字段宽度和可选精度之后。 - Ignacio Vazquez-Abrams
@Ignacio Vazquez-Abrams,使用新样式格式化也可以吗? - user1633361

16

如果想要使用Python 3.6+和f-Strings实现相同的功能,可以采用以下解决方案。

width = 20
py, vg = "Python", "Very Good"
print(f"{py:>{width}s} : {vg:>{width}s}")

1
s是什么? - Dan Nissenbaum
s表示传入的变量应被视为字符串。 - Praveen Kulkarni
s表示传入的变量将被视为字符串。 - undefined

5
print "%03d" % (43)

打印

043


1
使用字符串格式化。
print '%(#)03d' % {'#': 2}
002
print '%(#)06d' % {'#': 123}
000123

更多信息请见:链接文本


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接