递增字符串,同时保持前导零

本文关键字:字符串 | 更新日期: 2023-09-27 17:51:15

我需要一个算法来生成一组库存商品序列号,从一个起始序列号开始工作。

例如,起始序列为B10S001,生成3个数字,结果应为-

B10S001
B10S002
B10S003

然而,以B10S998为起始序列,生成3个数字,结果应该是-

B10S998
B10S999
B10T000

。数字的数目必须保持不变,必要时最后一个字母递增。

注意-我不知道第一个序列号的结构。可以是任意长度,也可以是字母和数字的任意组合。

我现在使用的代码是:

public static string IncrementNumber(string pNumber) {
    string newNum = "";
    var match = Regex.Match(pNumber, @"(?<=('D|^))'d+(?='D*$)");
    if (match.Success) {
        var number = int.Parse(match.Value) + 1;
        newNum = string.Format(
            "{0}{1}{2}",
            pNumber.Substring(0, match.Index),
            number,
            pNumber.Substring(match.Index + match.Length));
        }
    return newNum;
}

这让我找到了一些方法,但删除了前导零,并且不增加alpha。不太了解regex(从论坛帖子复制以上代码)-任何想法如何实现这一点?

递增字符串,同时保持前导零

假设您有整数值和字母,下面是您需要做的一些伪代码:

fun CreateSerial(value, letter):
  value = value + 1
  if value == 1000:
    letter = letter + 1
    if letter > 'Z':
      letter = 'A'
  if value < 10:
    return "B10" + letter + "00" + value
  else if value < 100:
    return "B10" + letter + "0" + value
  else:
    return "B10" + letter + value

EDIT:这里是不进行模式匹配的伪代码。

fun IncrementSerial(serial):
  IncrementNext(serial, serial.length - 1)
fun IncrementNext(serial, index):
  if index == 0:
    return
  if serial[index - 1] is numeral:
    IncrementNumeral(serial, index - 1)
  else:
    IncrementAlpha(serial, index - 1)
fun IncrementNumeral(serial, index):
  number = serial[index] + 1
  if number > '9':
    number = '0'
    IncrementNext(serial, index - 1)
  serial[index] = number
fun IncrementAlpha(serial, index):
  alpha = serial[index] + 1
  if alpha > 'Z':
    alpha = 'A'
    IncrementNext(serial, index - 1)
  serial[index] = alpha

本质上,我们从末尾开始增加字母,如果溢出,则重置字母并转到下一个,在每次迭代时检查它的类型(数字与alpha)。

如果我们得到最大序列号,它只是返回,你可以选择让它重置一切

您需要"手工"实现加法,就像您在一张纸上做长加法一样。首先,您需要将字符串视为一个数字,其中每个数字都在不同的基础上。最右边的第三个数字是以10为基数,最右边的字母是以26为基数,然后是两个以10为基数的数字,然后,可能是另一个以26为基数的数字。

现在你有了这个,开始从右边一个一个地增加数字。取最右边的数字,加1。如果没有溢出(也就是说,没有从9到0),就完成了。如果存在溢出,则该数字返回0,并且需要将其左侧的数字加1。

当你到达B10S999时,你增加最右边的数字,得到一个溢出。然后增加右第二位数字并获得溢出。然后是下一个数字,得到一个溢出。现在你增加了s,下一个字母是T,所以你得到B10T000。

在你得到B10Z999和增量之后,你会得到四个溢出,最后得到B11A000。

你为什么不把所有的逻辑放在一个类中,然后把它做完呢?显然你有4部分在你的系列,

 class Serial{
     Serial(string s);
     char prefixLetter;
     int prefixNum;
     char middleLetter;
     int traillingNum;
     void increment();
     bool isvalid();
     string toString();
     //etc....
 }