在保持前导零的同时增加字符串

时间:2013-01-10 08:04:19

标签: c# regex

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

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

B10S001
B10S002
B10S003

但是,使用B10S998的起始序列并生成3个数字,结果应为 -

B10S998
B10S999
B10T000

即。数字的数量必须保持不变,如果有必要,最后的alpha值会增加。

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

我目前使用的代码是:

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。不太了解正则表达式(从论坛帖子复制上面的代码) - 任何想法如何实现这个?

3 个答案:

答案 0 :(得分: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)。

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

答案 1 :(得分:1)

你需要手动实施添加,就像你在一张纸上长时间添加一样。首先,您需要将字符串视为一个数字,其中每个数字都在不同的基础上。第3个最右边的数字位于10的基数中,最右边的字母位于26的基数,然后是2个基数10位数,然后可能是另一个26位数字。

现在你有了这个,从右边开始逐个递增数字。取最右边的数字并将其递增1.如果没有溢出(即,你没有从9到0),你就完成了。如果有溢出,则数字变回0,你需要将数字增加到左边。

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

到达B10Z999并递增后,您将获得四次溢出,最终得到B11A000。

答案 2 :(得分:0)

为什么不将所有逻辑放在一个类中并完成它?显然你的序列中有4个部分,

 class Serial{
     Serial(string s);

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

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

     //etc....
 }