3

我需要一种算法来生成一组库存项目序列号,从起始序列开始工作。

例如,起始序列为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。不太了解正则表达式(从论坛帖子中复制上述代码) - 任何想法如何实现这一点?

4

3 回答 3

1

鉴于您有整数值和字母,这里是您需要做的一些伪代码:

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

编辑:这是没有模式匹配的伪代码。

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

如果我们达到最大序列号,它只会返回,您可以选择让它重置所有内容。

于 2013-01-10T08:52:46.147 回答
1

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

现在你有了这个,从右边开始一个接一个地递增数字。取最右边的数字并将其加 1。如果没有溢出(也就是说,您没有从 9 到 0),那么您就完成了。如果发生溢出,则该数字变回 0,您需要将该数字向左递增。

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

在您到达 B10Z999 并递增后,您将获得四次溢出,并以 B11A000 结束。

于 2013-01-10T08:58:30.067 回答
0

你为什么不把你所有的逻辑放在一个类中并完成它呢?显然,您的连续剧中有 4 个部分,

 class Serial{
     Serial(string s);

     char prefixLetter;
     int prefixNum;
     char middleLetter;
     int traillingNum;

     void increment();
     bool isvalid();
     string toString();

     //etc....
 }
于 2013-01-10T09:03:12.800 回答