关于python:将整数格式化为带前导零的字符串的最佳方法?

Best way to format integer as string with leading zeros?

本问题已经有最佳答案,请猛点这里访问。

我需要将前导零添加到整数,以生成一个具有定义数量的数字($cnt)的字符串。将这个简单函数从php转换为python的最佳方法是:

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

有什么功能可以做到这一点吗?


可以使用zfill()方法填充带零的字符串:

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


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

1
2
i = random.randint(0,99999)
print"%05d" % i

它将输出长度为5的字符串。

编辑:在python2.6及以上版本中,还有:

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

参见:https://docs.python.org/2/library/string.html


您很可能只需要格式化整数:

1
'%0*d' % (fill, your_int)

例如,

1
2
>>> '%0*d' % (3, 4)
'004'


python 3.6 f-strings允许我们轻松添加前导零:

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

看看这篇关于的好文章。


python 2.6允许:

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

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


对于python 3及更高版本:str.zfill()仍然是最可读的选项

但是,研究新的、功能强大的str.format()是一个好主意,如果您想填充一些非0的内容呢?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
    # 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


您至少有两个选项:

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

如果在python>2.5上,请参见clorz答案中的第三个选项。


内置zfill的一个线性替代方案。

此函数接受x并将其转换为字符串,并且仅在开头添加零(仅当长度太短时):

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

总而言之,内置:zfill已经足够好了,但是如果有人对如何手工实现这一点很好奇,这里还有一个例子。


一个简单的转换将是(同样使用一个函数):

1
2
3
4
5
def add_nulls2(int, cnt):
    nulls = str(int)
    for i in range(cnt - len(str(int))):
        nulls = '0' + nulls
    return nulls

这是我的python函数:

1
2
3
4
def add_nulls(num, cnt=2):
  cnt = cnt - len(str(num))
  nulls = '0' * cnt
  return '%s%s' % (nulls, num)