繁体   English   中英

字符串,整数和前导零

[英]Strings, ints and leading zeros

我需要在一个对象上记录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

试试str.zfill()

>>> s = "000123"
>>> i = int(s)
>>> i
123
>>> n = 6
>>> str(i).zfill(n)
'000123'

您可以提前检查字符串的长度,然后使用rjust填充到相同的长度:

>>> s = "000123"
>>> len_s = len(s)
>>> i = int(s)
>>> i
123
>>> str(i).rjust(len_s, "0")
'000123'

您可以使用以下方法检查所有数字的序列号:

if serial.isdigit():

我在这里开发我的评论, 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。

所以你可能想要使用格式...无论如何,你在%符号的右边有一个整数,它将替换左边字符串中的%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))

现在,使用格式( 格式规范 ):

'{0:06}'.format(n)

以相同的方式替换

('{0:0'+str(len(Obj1.serial))+'}').format(1+int(Obj1.serial))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM