如何在Python中递增数字字符串

3

我花了最近两天的时间尝试在Python中如何递增数字字符串。我正在尝试在创建记录时递增序列号。我昨天整天都试图将其作为整数来完成,虽然它可以正常工作,但我无法让数据库存储前导零。我在StackOverflow上对这个主题进行了广泛的研究,虽然有几个例子说明如何将其作为整数并存储前导零,但是没有一个例子适用于我。许多例子都来自2014年,所以方法可能已经改变了。然后我切换到字符串并将属性更改为CharField,并且可以使用前导零使函数正常工作,但是现在似乎无法递增。同样,我在SO上找到的例子都是从2014年开始的,所以也许事情已经有些改变了。这是一个可以正常工作但不会递增的函数。每次调用它时,它只返回00000001。我相信这是我没有做的简单的事情,但我已经没有想法了。提前感谢您的帮助。

def getNextSeqNo(self):
    x = str(int(self.request_number) + 1)
    self.request_number = str(x).zfill(8)
    return self.request_number

这里是字段的定义:

request_number = models.CharField(editable=True,null=True,max_length=254,default="00000")

由于系统提示缺少此项,我将默认添加“00000”:

int() argument must be a string, a bytes-like object or a number, not 'NoneType'

我意识到我的代码基本上是将我的默认值增加1,这就是为什么我总是得到00000001作为我的序列号。似乎无法弄清楚如何获取当前数字,然后再加1。任何帮助都将不胜感激。


2
不存在所谓的“数字字符串”。如果它是一个字符串,它就不是一个数字;它是一系列字符,其中一些或全部是数字字符。数字没有前导零;不存在01或001这样的十进制数。你不能在字符串上进行数学运算。如果你需要进行数学运算,将其转换为实际数字,进行计算,然后将其转换回字符串,并使用零字符左填充,直到达到所需长度。 - Ken White
1
离题了,但为什么要用 CharField?为什么不用 Integer - John Gordon
1
你确定 self.request_number 已经设置了吗?如果它给你默认值,那么可能没有被设置。 - Liam
感谢反馈。我正在尝试保留记录编号,例如00001、00002、00003。我可以通过在表示层添加0来显示数字,但希望人们也能够查询带有0000的记录编号。如果有更好的方法来处理这个问题,我很乐意听取建议。 - Steve Smith
@John Gordon。感谢您的考虑。我会认真考虑的。 - Steve Smith
显示剩余2条评论
4个回答

5

一段时间以前,我做了类似的事情。

你需要将字符串转换为整数,然后获取它的长度,然后计算所需的零的数量。

code = "00000" 
code = str(int(code) + 1 )
code_length = len(code)

if code_length < 5: # number five is the max length of your code
  code = "0" * (5 - code_length) + code

print(code)

3

能够这样做吗?可以。但是不要这么做。

将其转换为整数。

然后,增量是很容易的——如果你将其作为主键,它会自动完成。对于搜索,你将字符串转换为整数并搜索整数——这样你就不必担心实际包含多少个前导零,因为它们都会被忽略。否则,如果你使用6位数字,用户无法记住并输入了6个0和数字,然后找不到匹配的结果,你将会遇到问题。


0
number = int('00000150')
('0'*7 + str(number+1))[-8:]

这个函数接受任何数字,加1后将其与一个至少包含7个零的字符串连接起来,然后切片返回最后8个字符。
在我看来,这比测量长度并计算需要添加多少个零更简单、更优雅。


0
对于那些只想增加字符串中的最后一个数字的人来说。
引用: 导入re
a1 = 'name 1'
num0_m = re.search(r'\d+', str(a1))
if num0_m:
    rx = r'(?<!\d){}(?!\d)'.format(num0_m.group())
    print(re.sub(rx, lambda x: str(int(x.group()) + 1), a1))

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