我需要在一个对象上记录SerialNumber。我们输入许多物体。大多数序列号都是字符串 - 数字不是数字使用的,就像唯一标识符一样 - 但它们通常是顺序的。此外,由于序列号的唯一ID状态,前导零非常重要。
进行数据录入时,只需输入第一个"顺序"序列号(例如000123),然后是项目数量(例如5)以获得所需的输出 - 这样我们可以批量输入数据,见下文:
Obj1.serial = 000123
Obj2.serial = 000124
Obj3.serial = 000125
Obj4.serial = 000126
Obj5.serial = 000127
问题是,当你取第一个数字作为字符串,转向整数并递增时,你会松开前导零。
并非所有序列都是连续的 - 并非所有序列都是偶数(例如FDM-434 \ RRTASDVI908)
但那些是,我想自动进入。
在python中,在迭代之前在字符串中检查前导零(*和,我猜,像0009999这样的边缘情况)的最优雅方法是什么?然后在增量后重新应用这些零?
我有解决这个问题的方法,但它并不优雅。事实上,它是最无聊和最直接的alg。
这个问题有一个优雅的解决方案吗?
修改
为了澄清这个问题,我希望序列在增量之后具有相同的位数。
因此,在大多数情况下,这意味着重新应用相同数量的前导零。但在某些边缘情况下,前导零的数量将减少。例如:009 - > 010; 0099 - > 0100
答案 0 :(得分:3)
尝试str.zfill()
:
>>> s = "000123"
>>> i = int(s)
>>> i
123
>>> n = 6
>>> str(i).zfill(n)
'000123'
答案 1 :(得分:2)
您可以提前检查字符串的长度,然后使用rjust
填充相同的长度:
>>> s = "000123"
>>> len_s = len(s)
>>> i = int(s)
>>> i
123
>>> str(i).rjust(len_s, "0")
'000123'
您可以使用以下方法检查所有数字的序列号:
if serial.isdigit():
答案 2 :(得分:2)
我在这里发表评论,Obj1.serial
是一个字符串:
Obj1.serial = "000123"
('%0'+str(len(Obj1.serial))+'d') % (1+int(Obj1.serial))
就像@ owen-s的回答'%06d' % n
:打印数字并用前导0填充。
关于'%d' % n
,它只是one way of printing。来自PEP3101:
在Python 3.0中,%运算符由更强大的运算符补充 字符串格式化方法,格式()。支持str.format() 方法已被移植到Python 2.6。
所以你可能想要使用格式......无论如何,%
符号右边有一个整数,它将替换左边字符串中的%d
。
'%06d'
表示打印至少6(6)位(d)长,必要时填写0(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-specification):
'{0:06}'.format(n)
以相同的方式替换
('{0:0'+str(len(Obj1.serial))+'}').format(1+int(Obj1.serial))