我需要一个算法来生成一组库存商品序列号,从一个起始序列开始。
例如,使用起始序列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。不太了解正则表达式(从论坛帖子复制上面的代码) - 任何想法如何实现这个?
答案 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....
}