将整数格式化为带前导零的字符串的最佳方法是什么?

437

我需要在整数前面添加零,以使其成为一个具有指定位数($cnt)的字符串。从PHP转换为Python的最佳方式是什么:

function add_nulls($int, $cnt=2) {
    $int = intval($int);
    for($i=0; $i<($cnt-strlen($int)); $i++)
        $nulls .= '0';
    return $nulls.$int;
}

有没有一个函数可以实现这个?


1
你的代码正在产生通知,顺便说一下。 - SilentGhost
2
http://php.net/printf 是在 PHP 中前进的方式。 - SilentGhost
3
@SilentGhost,或者str_pad - Jasper Bekkers
5
为什么要在变量前加上美元符号($)? - user4396006
10个回答

835

您可以使用zfill()方法在字符串前面填充零:

In [3]: str(1).zfill(2)
Out[3]: '01'

3
有没有一种方法可以只返回实际的整数,例如004,而不是像'004'这样的字符串? - Ajay
72
@Ajay 004不是一个实际的整数。 - Alvaro
24
编译器解析004的方式,以及在内存中表示的方式和4完全相同。唯一能看到不同的时候是在.py源代码中。如果你需要存储像“在百位之前加前导零格式化此数字”之类的信息,仅仅使用整数是无法实现的 - 你需要使用其他数据结构(在这种情况下字符串很适合)。 - Gershom Maes
30
需要说明这是不正确的。事实上,004 == 4 的确有点幸运。解释器(Python 不是编译语言)解析整数的方式对于以前导 0 开头的整数是不同的。如果一个数字以 0 开头,则被视为八进制数。所以是的,004 == 4,但是 040 != 40,因为 040 = 4 * 8 + 0 = 32 - sbeliakov
14
澄清几件事情:1. 这仅适用于解析整数文字,而不是将字符串转换为整数 - 例如,如果您执行a = 010,则a的值将为8,但如果您执行a = int("010")则a的值将为10。2. 只有 Python 2 才会以这种方式工作 - 在 Python 3 中,a = 010 将会产生语法错误。在 Python 3 中,八进制以0o开头,例如0o10(可能是为了避免这种混淆)。 - Tom
显示剩余2条评论

262

标准方法是使用格式化字符串修饰符。这些格式化字符串方法在大多数编程语言中都可用(例如通过C语言的sprintf函数),是一种很方便的工具。

要输出长度为5的字符串:


...在Python 3.5及以上版本中:f-strings。

i = random.randint(0, 99999)
print(f'{i:05d}')

这里搜索f-strings以获取更多详细信息。


...Python 2.6及以上版本:

print '{0:05d}'.format(i)

在 Python 2.6 之前:

print "%05d" % i

请参阅:https://docs.python.org/3/library/string.html


1
那么如果您在运行时不知道零的数量呢?比如说一个列表的长度? - Zelphir Kaltstahl
4
你可以动态地创建格式化字符串,使用以下代码:[('{{0:0{0:d}d}}').format(len(my_list)).format(k) for k in my_list] - Mark
1
我选择连接格式字符串,例如插入列表的长度。您的方法有什么优点吗? - Zelphir Kaltstahl
4
当模板只包含一个 {...} 占位符时,无需使用 str.format()。避免解析模板并使用 format() 函数代替:format(i, '05d') - Martijn Pieters
2
@Mark 没有必要使用嵌套/堆叠格式。数字的位数可以是可变的:[('{0:0{1}d}').format(k, len(my_list)) for k in my_list] --- 使用f-string:[f'{k:0{len(my_list)}d}' for k in my_list] --- 奇怪的是,数字的位数由项目数量确定。您可能想准备 max_digits 并使用 [f'{k:0{max_digits}d}' for k in my_list] - pabouk - Ukraine stay strong

125

Python 3.6的f-strings使我们可以轻松地添加前导零:

number = 5
print(f' now we have leading zeros in {number:02d}')

看一下关于这个特性的这篇好文章


4
这是目前为止最符合 Python 风格的答案,也是我最喜欢的答案。 - John Forbes
7
现在应该接受这个答案。 - Johann Burgess

80

你很可能只需要对你的整数进行格式化:

'%0*d' % (fill, your_int)
例如,
>>> '%0*d' % (3, 4)
'004'

2
问题是 - 如何添加不固定数量的零 - ramusus
3
这不是永久的 - 实际上,您无法永久地将零添加到int的前面 - 这将被解释为八进制值。 - Matthew Schinckel
3
@Matthew Schnickel:我认为OP想知道一种计算所需零的数量的方法。格式处理得很好。而int(x, 10)处理前导零。 - unbeknown

24

Python 2.6 允许这样做:

add_nulls = lambda number, zero_count : "{0:0{1}d}".format(number, zero_count)

>>>add_nulls(2,3)
'002'

21

对于Python 3及以上版本: str.zfill()仍然是最易读的选项

但是,值得研究新而强大的str.format()。如果您想填充不是0的内容呢?

    # if we want to pad 22 with zeros in front, to be 5 digits in length:
    str_output = '{:0>5}'.format(22)
    print(str_output)
    # >>> 00022
    # {:0>5} meaning: ":0" means: pad with 0, ">" means move 22 to right most, "5" means the total length is 5

    # another example for comparision
    str_output = '{:#<4}'.format(11)
    print(str_output)
    # >>> 11##

    # to put it in a less hard-coded format:
    int_inputArg = 22
    int_desiredLength = 5
    str_output = '{str_0:0>{str_1}}'.format(str_0=int_inputArg, str_1=int_desiredLength)
    print(str_output)
    # >>> 00022

8

你至少有两个选项:

  • str.zfill: lambda n, cnt=2: str(n).zfill(cnt)
  • % 格式化: lambda n, cnt=2: "%0*d" % (cnt, n)

如果使用 Python >2.5,可以参考 clorz 的回答中的第三个选项。


4

替代内置zfill的一行代码。

此函数将x转换为字符串,并仅在长度不足时在开头添加零:

def zfill_alternative(x,len=4): return ( (('0'*len)+str(x))[-l:] if len(str(x))<len else str(x) )

总之,内置的zfill已经足够好了,但如果有人想知道如何手动实现它,这里还有一个例子。

1
一个简单的转换方式是(同样使用函数):
def add_nulls2(int, cnt):
    nulls = str(int)
    for i in range(cnt - len(str(int))):
        nulls = '0' + nulls
    return nulls

-3
这是我的Python函数:
def add_nulls(num, cnt=2):
  cnt = cnt - len(str(num))
  nulls = '0' * cnt
  return '%s%s' % (nulls, num)

3
这就是 str.zfill 的作用 :) - tzot
1
是的 :) 另一种方法是这样的: '%03d' % 8 - Emre Köse

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