我需要在整数前面添加零,以使其成为一个具有指定位数($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;
}
有没有一个函数可以实现这个?
我需要在整数前面添加零,以使其成为一个具有指定位数($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;
}
有没有一个函数可以实现这个?
您可以使用zfill()
方法在字符串前面填充零:
In [3]: str(1).zfill(2)
Out[3]: '01'
004
的方式,以及在内存中表示的方式和4
完全相同。唯一能看到不同的时候是在.py
源代码中。如果你需要存储像“在百位之前加前导零格式化此数字”之类的信息,仅仅使用整数是无法实现的 - 你需要使用其他数据结构(在这种情况下字符串很适合)。 - Gershom Maes004 == 4
的确有点幸运。解释器(Python 不是编译语言)解析整数的方式对于以前导 0
开头的整数是不同的。如果一个数字以 0
开头,则被视为八进制数。所以是的,004 == 4
,但是 040 != 40
,因为 040 = 4 * 8 + 0 = 32
。 - sbeliakov标准方法是使用格式化字符串修饰符。这些格式化字符串方法在大多数编程语言中都可用(例如通过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
[('{{0:0{0:d}d}}').format(len(my_list)).format(k) for k in my_list]
。 - Mark{...}
占位符时,无需使用 str.format()
。避免解析模板并使用 format()
函数代替:format(i, '05d')
。 - Martijn Pieters[('{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 strongPython 3.6的f-strings使我们可以轻松地添加前导零:
number = 5
print(f' now we have leading zeros in {number:02d}')
看一下关于这个特性的这篇好文章。
你很可能只需要对你的整数进行格式化:
'%0*d' % (fill, your_int)
例如,>>> '%0*d' % (3, 4)
'004'
Python 2.6 允许这样做:
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的内容呢?
# 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
你至少有两个选项:
lambda n, cnt=2: str(n).zfill(cnt)
%
格式化: lambda n, cnt=2: "%0*d" % (cnt, n)
如果使用 Python >2.5,可以参考 clorz 的回答中的第三个选项。
zfill
的一行代码。此函数将x
转换为字符串,并仅在长度不足时在开头添加零:
def zfill_alternative(x,len=4): return ( (('0'*len)+str(x))[-l:] if len(str(x))<len else str(x) )
zfill
已经足够好了,但如果有人想知道如何手动实现它,这里还有一个例子。def add_nulls2(int, cnt):
nulls = str(int)
for i in range(cnt - len(str(int))):
nulls = '0' + nulls
return nulls
def add_nulls(num, cnt=2):
cnt = cnt - len(str(num))
nulls = '0' * cnt
return '%s%s' % (nulls, num)