我需要在对象上记录SerialNumber(s)。我们输入许多对象。大多数序列号都是字符串-数字不会像唯一标识符一样在数字上使用-但它们通常是顺序的。此外,由于序列号的唯一ID状态,前导零很重要。
进行数据输入时,最好输入第一个“顺序”序列号(例如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
我在这里发表我的评论,Obj1.serial
是一个字符串:
Obj1.serial = "000123"
('%0'+str(len(Obj1.serial))+'d') % (1+int(Obj1.serial))
就像@ owen-s的答案'%06d' % n
:打印数字并以0开头填充。
关于'%d' % n
,这只是一种打印方式。从PEP3101:
在Python 3.0中,%运算符由更强大的字符串格式化方法format()进行了补充。对str.format()方法的支持已反向移植到Python 2.6。
因此,您可能要改用format ...无论如何,%
符号的右边有一个整数,它将替换%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))
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句