如何在Python中将数字字符串“0000000001”递增?

8
我有一个函数 getNextSeqNo(),我希望每次调用时它都可以递增数字字符串,即从00000000000000000001,再到0000000002。我该如何实现呢?
我已经按照如下方式编写了它:
def __init__(self) :
    self.seq = '0000000000'

def getNextSeqNo(self) :
    self.seq = str(int(self.seq) +1)
    return(self.seq)

我得到的输出是数字1而不是0000000001

我是Python的新手,对于格式说明符一无所知。非常感谢大家,现在完美运行了。 :) - Kat.S
7个回答

9
您可以将字符串转换为整数,然后使用类似以下的内容:
self.seq = '%010d' % (int(self.seq) + 1)
return self.seq

如果您不需要self.seq是一个字符串,您可以这样做:
def __init__(self) :
    self.seq = 0

def getNextSeqNo(self) :
    self.seq += 1
    return '%010d' % self.seq

@Martijn 感谢你提醒。 - Khaelex

6

最快最简单的方法,虽然肯定不是最清晰的:

str(int('9' + self.seq) + 1)[1:]

该方法通过在转换为整数之前添加一个前导数字来保留所有前导零,然后在转换回字符串后去除该前导数字。它的优点是不需要事先知道需要多少位数字。


相当不干净,引发了几个边界问题。 - njzk2
@njzk2,不确定你所说的“unclean”是什么意思,我只能想到一个边界问题——但这是一个很大的问题。 - Mark Ransom
1
如果数字为负数,则减号将被去除。如果数字为9 * x,则结果将为0 *(x + 1),导致a / 错误值b / 数字错误。 (出于第二个原因,我可能会选择“'1'+self.seq'。”)这是2个边界问题(好吧,可能不完全是几个)。至于不干净,我的意思是代码没有传达所执行操作的含义。 - njzk2

4

使用format()函数,对数字进行格式化:

self.seq = format(int(self.seq) + 1, '010d')

更好的做法是,不要存储字符串而是整数,并返回格式化后的版本:
def __init__(self):
    self.seq = 0

def getNextSeqNo(self):
    self.seq += 1
    return format(self.seq, '010d')

使用010d格式将整数输出为具有10个字符的0填充字符串:

>>> format(0, '010d')
'0000000000'
>>> format(42, '010d')
'0000000042'

存储整数时,请使用整数而不是类似整数的字符串。 - chepner

3

有很多答案,这里是另一个:

import string
seq = 1
string.zfill(seq, 10)
# '0000000001'
# works with strings too:
string.zfill('00001', 10)
# '0000000001'

或者

seq = 1
str(seq).zfill(10)
# '0000000001'

请注意,string.zfill 直接将 int 作为参数输入。

从来不知道这个方法存在! - Erik Kaplun

1
你应该将当前的数值存储为一个 int,并在需要时动态生成字符串。
>>> i = 0
>>> "{0:010d}".format(i)
'0000000000'

>>> i += 1
>>> "{0:010d}".format(i)
'0000000001'

不要将数字值以字符串形式存储,仅仅因为你希望这样呈现它们(或者在某些需要字符串的上下文中使用)是一个不好的想法。
然后,getNextSeqNo 变成了这样:
def getNextSeqNo(self):
    ret = "{0:010d}".format(self._seq_i)
    self._seq_i += 1
    return ret

1
你可以使用字符串格式化来实现它:

new_s = '{:0>{}}'.format(str(int(s)+1),len(s))

print new_s

0

最好的方法是,不要在字符串中保留序列,而是在需要时格式化序列号:

class SeqNo:
    def __init__(self):
        self.seq = 0

    def next(self):
        self.seq += 1
        return '%10d' % self.seq

你的意思是“在一个整数(int)中”。 - Erik Kaplun

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接