2013-03-07 76 views
6

我有一个字符串,我需要递增1该字符串同时具有字符和数字值。用字母和数字递增字符串

字符串布局,我有如下“MD00494”

我怎么会增加此为“MD00496” &“MD00497” ECT

如果这是一个正常的字符串,数字,我将它解析到一个int。

我曾尝试以下

int i = int.Parse(sdesptchNo); 
i++; 
txtDispatchNo.Text = i.ToString(); 

任何人任何想法如何,我会去了解这一点。

+0

“MD00497”中的'D'最终会变成'E'吗? – Mohayemin 2013-03-07 10:40:38

+0

没有D将永远呆在d它不会是那个大的地方,我需要去超过3000 – Inkey 2013-03-07 10:42:09

+1

@Inkey:没关系,你不需要超过3000.你**必须**指定将会发生什么如果你超过了99999,除非你喜欢可能表现出未知行为的代码。 – Jon 2013-03-07 11:08:56

回答

12

你首先应该弄清字符串之间的任何共性。如果在末尾总是有一个字母前缀后跟数字(具有固定宽度),那么您可以删除这些字母,解析其余字符,然后再将它们粘在一起。

E.g.你的情况,你可以使用像下面这样:

var prefix = Regex.Match(sdesptchNo, "^\\D+").Value; 
var number = Regex.Replace(sdesptchNo, "^\\D+", ""); 
var i = int.Parse(number) + 1; 
var newString = prefix + i.ToString(new string('0', number.Length)); 

,可能是有点更强大的另一种选择可能是

var newString = Regex.Replace(x, "\\d+", 
    m => (int.Parse(m.Value) + 1).ToString(new string('0', m.Value.Length))); 

这将通过在递增编号替换字符串中任意数量相同的宽度 - 但会使每个非数字完全相同并在相同的位置。

2

您需要找到字符串中第一个数字的位置。 然后将字符串分成2个字段。

MD 0 0 4 9 4

第一场将非数字部分 “MD” 第二字段将是数字部分 “00494”

增量数字只有部分“00495”

你会失去前导零的,所以你需要垫你的新号码与相同数量的零的,一旦你已经增加。

然后加入2个字段。

+1

我会查找字符串中最后一个非数字的位置,而不是第一个数字,以防像“Foo37Baz00123”这样的字符串。 – 2016-04-25 14:36:37

3

假设您只需要增加字符串的数字部分,并且字符串的结构始终是 - 一串非数字字符后跟一串数字,则可以使用正则表达式分解将字符串转换为这两个组件,将数字部分转换为整数,然后递增并连接回来。

var match = Regex.Match("MD123", @"^([^0-9]+)([0-9]+)$"); 
var num = int.Parse(match.Groups[2].Value); 

var after = match.Groups[1].Value + (num + 1); 
0

您可以使用正则表达式:

int kod = int.Parse(Regex.Replace(sdesptchNo, "[^0-9]", "")) + 1; 

string zeroStr=Regex.Replace(sdesptchNo, "[^0-9]", ""); 
string newZeroStr=""; 
for (int x=0;x<zeroStr.length;x++) 
    if (zeroStr[x]=='0') newZeroStr=newZeroStr+"0"; 
    else break; 

string newVal=Regex.Replace(sdesptchNo, "[0-9]", "") + newZeroStr + kod; 

更新:这将节省您的零

+0

这将失去前导零。 – juharr 2013-03-07 10:44:40

2

这是一个非正则表达式的方法:P

string str = "MD00494"; 
string digits = new string(str.Where(char.IsDigit).ToArray()); 
string letters = new string(str.Where(char.IsLetter).ToArray()); 

int number; 
if (!int.TryParse(digits, out number)) //int.Parse would do the job since only digits are selected 
{ 
    Console.WriteLine("Something weired happened"); 
} 

string newStr = letters + (++number).ToString("D5"); 

输出将是:

newStr = "MD00495" 
0

这里是我的解决方案:

string str = Console.ReadLine(); 
string digits = new string(str.Where(char.IsDigit).ToArray()); 
string letters = new string(str.Where(char.IsLetter).ToArray()); 
string newStr; 
int number; 

if (!int.TryParse(digits, out number)) 
{ 
    Console.WriteLine("Something weird happened"); 
} 
if (digits.StartsWith("0")) 
{ 
    newStr = letters + (++number).ToString("D5"); 
} 
else 
{ 
    newStr = letters + (++number).ToString(); 
} 

试试吧!

0
string sDispatchNo = "MS00914"; 
var pattern = @"^[a-zA-Z]+"; 
var strPart = Regex.Match(sDispatchNo, pattern).Value; 
var noPart = Regex.Replace(sDispatchNo, pattern, ""); 
var no = int.Parse(noPart); 
var length = noPart.Length; 
length = (no + 1)/(Math.Pow(10,length)) == 1 ? length + 1 : length; 
var output = strPart + (no + 1).ToString("D" + length); 
+0

这是一个非常通用的,可用于任何大数目。步骤:1.识别字符串部分 2.识别号码部分及其长度 3.增加号码 4合并字符串和数字 – kaushal 2013-03-07 11:14:43