如何在 Python 中递增数字字符串
How to increment a numeric string in Python
过去两天我一直在试图弄清楚如何在 Python 中递增数字字符串。我试图在创建记录时增加序列号。昨天我花了一整天的时间尝试将其作为一个整数来执行,它工作正常,但我永远无法让数据库存储前导零。我在 Whosebug 中对这个主题进行了广泛的研究,虽然有几个示例说明如何将其作为整数执行此操作并存储前导零,但其中 none 个示例对我有用。许多例子都来自 2014 年,所以也许方法已经改变了。然后我切换到一个字符串并将我的属性更改为一个 CharField,并且可以使函数使用前导零,但现在我似乎无法让它递增。同样,我在 SO 上找到的示例是 2014 年的,所以情况可能发生了一些变化。这是有效的函数,但每次我调用它时,它都不会增加。它只是 returns 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。感谢任何帮助。
这能做到吗?是的。但是不要这样做。
设为整数。
递增是微不足道的 - 如果您将其设为主键,则自动递增。对于搜索,您将字符串转换为整数并搜索整数 - 这样您就不必担心实际包含了多少前导零,因为它们都会被忽略。否则,如果您使用 6 位数字并且用户不记得并输入 6 个 0 + 数字然后没有匹配,您将遇到问题。
以前我做过类似的东西
你必须将你的字符串转换为 int,然后你必须得到它的长度,然后你必须计算你需要的零的数量
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)
number = int('00000150')
('0'*7 + str(number+1))[-8:]
这需要任何数字,加 1,concatenates/joins 它到一个由几个(在你的情况下至少 7 个)零组成的字符串,然后切片到 return 最后 8 个字符。
恕我直言,比测量长度和计算要添加多少个零更简单、更优雅。
对于那些只想增加字符串中最后一个数字的人。
Import 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))
过去两天我一直在试图弄清楚如何在 Python 中递增数字字符串。我试图在创建记录时增加序列号。昨天我花了一整天的时间尝试将其作为一个整数来执行,它工作正常,但我永远无法让数据库存储前导零。我在 Whosebug 中对这个主题进行了广泛的研究,虽然有几个示例说明如何将其作为整数执行此操作并存储前导零,但其中 none 个示例对我有用。许多例子都来自 2014 年,所以也许方法已经改变了。然后我切换到一个字符串并将我的属性更改为一个 CharField,并且可以使函数使用前导零,但现在我似乎无法让它递增。同样,我在 SO 上找到的示例是 2014 年的,所以情况可能发生了一些变化。这是有效的函数,但每次我调用它时,它都不会增加。它只是 returns 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。感谢任何帮助。
这能做到吗?是的。但是不要这样做。
设为整数。
递增是微不足道的 - 如果您将其设为主键,则自动递增。对于搜索,您将字符串转换为整数并搜索整数 - 这样您就不必担心实际包含了多少前导零,因为它们都会被忽略。否则,如果您使用 6 位数字并且用户不记得并输入 6 个 0 + 数字然后没有匹配,您将遇到问题。
以前我做过类似的东西
你必须将你的字符串转换为 int,然后你必须得到它的长度,然后你必须计算你需要的零的数量
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)
number = int('00000150')
('0'*7 + str(number+1))[-8:]
这需要任何数字,加 1,concatenates/joins 它到一个由几个(在你的情况下至少 7 个)零组成的字符串,然后切片到 return 最后 8 个字符。
恕我直言,比测量长度和计算要添加多少个零更简单、更优雅。
对于那些只想增加字符串中最后一个数字的人。
Import 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))