【问题标题】:How to increment the last part of string that contains a number如何增加包含数字的字符串的最后一部分
【发布时间】:2018-10-15 15:33:23
【问题描述】:

我有这个序列:

string serialTXT = "SD50MRF999";

我想将其增加到“SD50MRF1000”而不是“SD51MRF000”。

我试过这个:

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

但结果:它隔离了“SD”和“50MRF1000”

【问题讨论】:

  • 您的问题是如何识别字符串中的最后一个数字,而不是增加它。我认为如果你用正则表达式标记它并更改标题,你更有可能得到答案
  • 您的基本问题是您将存储在字符串中的内容应该存储在将文本部分与数字部分分开的数据类型中。如果您以正确的格式存储数据,则无需解决此问题。

标签: c# .net regex string linq


【解决方案1】:

我通常会为此目的使用LINQ

string serialTXT = "SD50MRF01";
string intPart = string.Join("", serialTXT.Reverse().TakeWhile(char.IsDigit).Reverse());
int intP = int.Parse(intPart);
serialTXT = serialTXT.Remove(serialTXT.Length - intPart.Length) + 
            (intP < 10 ? "0" + (intP + 1) : (intP + 1).ToString());

结果 => "SD50MRF1000"

只是不要忘记将其添加到您的 using 指令中:

using System.Linq;

【讨论】:

  • "SD50MRF01" => "SD50MRF2" .. 我怎样才能使数字格式相同
  • @BassemKamalM 您可以检查小于 10 的冷杉编号,然后在其中的第一个添加 "0",正如我在更新的答案中所显示的那样。
  • @S.Akbari 您可以使用ToString("00")ToString("D2") 代替比较。
【解决方案2】:

您可以使用正则表达式获取最后一位数字,然后将其转换为数字,并将其附加到字符串不匹配部分的末尾:

string serialTXT = "SD50MRF999";
Regex re = new Regex( "([0-9]+)$"); /* digits at the end */
string end = re.Match(serialTXT).Value;
int newNum = int.Parse(end) + 1; /* we need a number to increment it */
string newSerial = serialTXT.Substring(0, serialTXT.Length - end.Length) + newNum;

【讨论】:

    【解决方案3】:

    一个非正则表达式的答案是检查字符串中的最后一个字符是否是一个数字,然后是下一个,等等,直到你得到你的数字。

    【讨论】:

      【解决方案4】:

      像@S.Akbari 一样,我认为 Linq 在这里可以做得很好。这个 sn-p 将适用于像 "SD50MRF50" 这样的字符串。

      public static void Main()
      {
          var str = "SD50MRF999";
          var digits = str.Reverse().TakeWhile(char.IsDigit);
          var number = digits.Select((x,i) => (x - '0') * Math.Pow(10, i)).Sum();
          var letters = str.Remove(str.Length - digits.Count());
      
          // use letters + (++number).ToString("00")
          // or letters + (++number).ToString("D2")
          // to write `01`, `02`, `03` etc.
          Console.WriteLine(letters + (++number));
      }
      

      Try it Online!

      【讨论】:

      • 谢谢你,它工作正常......只有我需要验证最后一个字符是数字
      • @S.Akbari 好的,完美。 :)
      • "SD50MRF01" => "SD50MRF2" .. 我怎样才能使数字格式相同
      • @BassemKamalM 类似this? (如果你觉得有用,别忘了给答案投票)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-02-24
      • 2019-06-19
      • 1970-01-01
      • 2015-05-03
      • 2015-06-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多