显示带前导零的数字

1388

如何在所有小于两位数的数字前显示前导零?

1    →  01
10   →  10
100  →  100
19个回答

1841
在Python 2(以及Python 3)中,您可以执行以下操作:
number = 1
print("%02d" % (number,))

基本上,% 就像 printf 或者 sprintf (参见docs)。

对于 Python 3+,同样的行为也可以通过 format 实现:

number = 1
print("{:02d}".format(number))

对于 Python 3.6+,可以使用 f-strings 实现相同的行为:

number = 1
print(f"{number:02d}")

12
例如:对于一个5位数的邮政编码,可以使用以下代码打印出来:print "%05d" % result['postalCode']。 - Nick Woodhams
5
x = "%02d.txt" % i 报错 TypeError (cannot concatenate 'str' and 'int' objects),但是 x = "%02d.txt" % (i,) 不会报错。有趣。我想知道这个在哪里有文档记录。 - theta
2
@theta 在2.7.6中,我没有收到错误。也许这是Python特定版本中的一个错误,他们已经修复了? - Jack M.
3
也许。在2.7.6版本中,如果格式值不是元组(至少对于此示例),则不会引发异常。根据我的评论日期,我猜当时我正在运行2.7.3,那时我不知道将单个变量放��元组中可使使用“%”字符串格式化更安全。 - theta
6
详细来说,文档在这里解释道:“当没有明确的对齐方式时,在宽度字段之前添加零('0')字符可启用数字类型的有符号零填充。这相当于将填充字符设置为'0'并将对齐类型设为'='。” - JHS
显示剩余4条评论

1214
你可以使用 str.zfill:
print(str(1).zfill(2))
print(str(10).zfill(2))
print(str(100).zfill(2))

输出:

01
10
100

90
我喜欢这个解决方案,因为它不仅在输出数字时有用,还可以在需要将其分配给变量时使用...例如,x = str(datetime.date.today().month).zfill(2) 将返回 '02' 作为二月份的月份。 - EroSan
6
这应该是正确的答案,因为"{1:02d}"无法使用变量代替2(例如如果您正在创建一个动态函数)。 - Joshua Varghese
6
它可以有变量:"{0:0{1}}"。将任意数量的零作为第二个参数传递即可。 - Jim
1
以上回答很好!但是这个是目前最好的。 - Ice Bear
这种方法也适用于在浮点数前面添加零。 - kfmfe04

384
在 Python 2.6+ 和 3.0+ 版本中,您可以使用 format() 字符串方法:
for i in (1, 10, 100):
    print('{num:02d}'.format(num=i))

或者使用内置函数(针对单个数字):

print(format(i, '02d'))

参见PEP-3101文档以了解新的格式化函数。


30
这段话的意思是“在Python 2.7.5中也可以使用此方法。如果您不想使用命名参数,您还可以使用'{:02d}'.format(1)。”需要注意的是,在翻译时应保留原文的意思,并尽可能使其通俗易懂。 - Jason Martens
1
在2.7.2中运行良好,使用浮点数"{0:04.0f}".format(1.1)会得到0001(:04 = 至少4个字符,在这种情况下是前导0,.0f = 浮点数没有小数)。我知道%格式化,但想修改现有的.format语句而不必重写整个语句。谢谢! - Michael Stimson

158
print('{:02}'.format(1))
print('{:02}'.format(10))
print('{:02}'.format(100))

输出:

01
10
100

1
这种方法可以让你在字符串中重复参数多次: 一零:{0:02}, 两个零: {0:03}, 九个零: {0:010}'.format(6) - srodriguex
2
仅兼容Python 3。如果使用Python 2.7,则执行print '{:02}'.format(1) - Blairg23

115
在 Python >= 3.6 中,您可以使用新的 f-strings 来简洁地实现此操作,方法如下:
f'{val:02}'

这段代码打印了变量名为val的变量,使用fill值为0width值为2

对于您的特定示例,您可以在循环中轻松完成此操作:

a, b, c = 1, 10, 100
for val in [a, b, c]:
    print(f'{val:02}')

它打印出:

01 
10
100

如需了解更多关于f-strings的信息,请查看PEP 498,这是它们被引入的地方。


93

或者这样写:

print '{0:02d}'.format(1)


73
x = [1, 10, 100]
for i in x:
    print '%02d' % i

结果是:

01
10
100

阅读有关在文档中使用%进行字符串格式化的更多信息。


9
这个文档的示例很糟糕。他们将映射与前导零样例混合在一起,所以除非你已经知道它的工作原理,否则很难分辨哪一个是哪一个。实际上,这就是我来这里的原因。 - Grant

60

这样做的Pythonic方式:

str(number).rjust(string_width, fill_char)

如果原始字符串的长度大于string_width,则返回原始字符串而不作任何更改。例如:

a = [1, 10, 100]
for num in a:
    print str(num).rjust(2, '0')

结果:

01
10
100

35

或者另一个解决方案。

"{:0>2}".format(number)

4
这将是Python的写法,尽管我会加上参数以增加清晰度 - "{0:0>2}".format(number),如果有人想要nLeadingZeros,他们应该注意也可以这样做:"{0:0>{1}}".format(number, nLeadingZeros + 1) - Jonathan Allan

9

它已经内置在Python中,使用字符串格式化。

f'{number:02d}'

这个老问题不需要更多的答案。你的回答也是已接受答案的重复,没有额外的信息。 - thedemons

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