字符串、整数与前导零
我需要在一个物体上记录序列号。我们会输入很多物体。大多数序列号是字符串形式的——这些数字并不是用来进行数学运算的,而是作为唯一的标识符——而且它们通常是连续的。此外,前导零很重要,因为它们是序列号唯一性的一部分。
在输入数据时,能够只输入第一个“连续”的序列号(比如 000123),然后输入物品的数量(比如 5),这样就能一次性得到想要的结果,这样我们就可以批量输入数据,见下方:
Obj1.serial = 000123
Obj2.serial = 000124
Obj3.serial = 000125
Obj4.serial = 000126
Obj5.serial = 000127
问题是,当你把第一个字符串形式的数字转换成整数并增加时,前导零就会消失。
并不是所有的序列号都是连续的——也并不是所有的都是数字(比如 FDM-434\RRTASDVI908)。
但是对于那些连续的序列号,我想要自动化输入。
在 Python 中,检查字符串中的前导零(还有一些特殊情况,比如 0009999)最优雅的方法是什么?在增加数字后,如何再把这些零加回来?
我有一个解决这个问题的方法,但它并不优雅。实际上,它是最无聊和直接的算法。
有没有更优雅的解决方案呢?
编辑
为了更清楚地说明问题,我希望序列号在增加后保持相同的位数。
所以,在大多数情况下,这意味着要重新加上相同数量的前导零。但是在一些特殊情况下,前导零的数量会减少。比如:009 -> 010;0099 -> 0100。
3 个回答
你可以提前检查一下字符串的长度,然后用 rjust
方法来填充到相同的长度:
>>> s = "000123"
>>> len_s = len(s)
>>> i = int(s)
>>> i
123
>>> str(i).rjust(len_s, "0")
'000123'
你可以用下面的方法检查一个序列号是否全是数字:
if serial.isdigit():
试试 str.zfill()
这个方法:
>>> s = "000123"
>>> i = int(s)
>>> i
123
>>> n = 6
>>> str(i).zfill(n)
'000123'
我在这里开发我的评论,Obj1.serial
是一个字符串:
Obj1.serial = "000123"
('%0'+str(len(Obj1.serial))+'d') % (1+int(Obj1.serial))
这就像 @owen-s 的回答 '%06d' % n
:打印数字,并在前面加上零。
关于 '%d' % n
,这只是 打印的一种方式。根据 PEP3101:
在 Python 3.0 中,% 操作符被一个更强大的字符串格式化方法 format() 所补充。str.format() 方法的支持已经被移植到 Python 2.6。
所以你可能想用 format 来替代……无论如何,你在 %
符号右边有一个整数,它会替换左边字符串中的 %d
。
'%06d'
的意思是打印至少 6 位数字(d),如果需要的话用 0 来填充。
由于 Obj1.serial
是一个字符串,你必须在增加之前把它转换成整数:1+int(Obj1.serial)
。而且因为右边需要一个整数,我们可以这样保留。
现在,对于左边的部分,由于我们不能硬编码 6,我们必须取 Obj1.serial
的长度。但这是一个整数,所以我们需要把它再转换回字符串,并与表达式的其余部分拼接成 %0 6 d :'%0'+str(len(Obj1.serial))+'d'
。因此
('%0'+str(len(Obj1.serial))+'d') % (1+int(Obj1.serial))
现在,使用 format (格式说明):
'{0:06}'.format(n)
以相同的方式被替换为
('{0:0'+str(len(Obj1.serial))+'}').format(1+int(Obj1.serial))