递增字符串,同时保持前导零
本文关键字:字符串 | 更新日期: 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....
}