【问题标题】:How to increment a numeric string in Python如何在 Python 中增加数字字符串
【发布时间】:2017-12-21 16:32:46
【问题描述】:

过去两天我一直在试图弄清楚如何在 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。感谢任何帮助。

【问题讨论】:

  • 没有数字字符串这样的东西。如果是字符串,则不是数字;它是一个字符序列,其中一些或全部恰好是数字字符。数字没有前导零;没有像 01 或 001 这样的十进制数。您不会对字符串进行数学运算。如果您需要进行数学运算,请将其转换为实际数字,进行计算,然后将其转换回字符串,并用零字符填充,直到获得所需的长度。
  • 跑题了,但为什么它是CharField?为什么不是Integer
  • 您确定self.request_number 已设置吗?如果它为您提供默认值,则可能不是
  • 感谢您的反馈。我正在尝试保留一个记录号,例如 00001、00002、00003。我可以通过在表示层添加 0 来很好地显示这些数字,但希望人们也能够使用 0000 来查询记录号。如果有更好的方法来解决这个问题,我愿意接受建议。
  • 通过搜索request_number=0001 而不仅仅是request_number=1,用户可以获得什么好处?

标签: python django django-models python-3.6 postgresql-9.4


【解决方案1】:

这可以吗?是的。但不要这样做。

将其设为整数。

然后递增是微不足道的 - 如果您将其设为主键,则自动递增。对于搜索,您将字符串转换为整数并搜索整数 - 这样您就不必担心实际包​​含了多少前导零,因为它们都将被忽略。否则,如果您使用 6 位数字并且用户不记得并输入 6 个 0 的 + 数字然后无法匹配,您将遇到问题。

【讨论】:

    【解决方案2】:

    以前我做过类似的东西

    你必须将你的字符串转换为 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)
    

    【讨论】:

      【解决方案3】:

      对于那些只想增加字符串中最后一个数字的人。

      进口再

      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))
      

      【讨论】:

        【解决方案4】:
        number = int('00000150')
        ('0'*7 + str(number+1))[-8:]
        

        这需要任何数字,加 1,将其连接/加入一个由多个(在您的情况下至少为 7 个)零组成的字符串,然后切片以返回最后 8 个字符。
        恕我直言,比测量长度和计算要添加多少个零更简单、更优雅。

        【讨论】:

          猜你喜欢
          • 2014-06-09
          • 1970-01-01
          • 2016-08-27
          • 2023-03-03
          • 1970-01-01
          • 2017-04-30
          • 2021-06-24
          • 2023-03-15
          • 1970-01-01
          相关资源
          最近更新 更多