【问题标题】:Increment a string with both letters and numbers增加一个包含字母和数字的字符串
【发布时间】:2022-03-24 23:21:31
【问题描述】:

我有一个字符串,我需要增加 1 该字符串既有字符又有数值。

我的字符串布局如下“MD00494”

我如何将其增加到“MD00496”和“MD00497”等

如果它是带有数字的普通字符串,我会将其解析为 int。

我已经尝试了以下

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

任何人都知道我会怎么做。

【问题讨论】:

  • “MD00497”中的“D”最终会变成“E”吗?
  • 没有 D 将永远停留在 d 它不会那么大,我需要超过 3000
  • @Inkey:你不需要超过 3000 也没关系。你必须指定如果超过 99999 会发生什么,除非你喜欢代码可能会表现出未知行为。

标签: c# .net


【解决方案1】:

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

例如在您的情况下,您可以使用以下内容:

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

这会将字符串中的任何数字替换为相同宽度的递增数字 - 但每个非数字都完全相同且位于同一位置。

【讨论】:

  • 上帝保佑 PHP 提供 ++$whatever 来增加任何字符串!
  • @hpaknia,不知道上帝与此有什么关系,但如果字符串不以数字结尾,PHP 不会导致数字递增。
  • 我对您评论的第二部分有答案。 PHP 确实增加了非数字值。请看rextester.com/QMF41107
  • @hpaknia: 确切地说,如果您想要增加的数字恰好不在字符串的 end 处,那么 PHP 会增加字符串末尾的任何值字符串,包括字母。与溢出相同,foo213barfoo9 之类的字符串不太可能产生您想要的结果。
【解决方案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"

【讨论】:

  • 这是一个优雅的解决方案,尽管值得添加这个字符串 newStr = letters + (++number).ToString($"D{digits.Length}");这将允许不同数量的前导零
【解决方案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);

【讨论】:

    【解决方案4】:

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

    0 1 2 3 4 5 6

    MD 0 0 4 9 4

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

    将仅数字部分增加到“00495”

    您将失去前导零,因此您需要在增加后用相同数量的零填充新数字。

    然后加入 2 个字段。

    【讨论】:

    • 我会寻找字符串中最后一个非数字的位置,而不是第一个数字,以防它是像"Foo37Baz00123" 这样的字符串。
    【解决方案5】:

    你可以使用正则表达式:

    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;
    

    更新:这将保存你的零

    【讨论】:

    • 这会丢失前导零。
    【解决方案6】:
    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);
    

    【讨论】:

    • 这是一个非常通用的,可用于任何大数。步骤: 1. 识别字符串部分 2. 识别数字部分及其长度 3. 递增数字 4 合并字符串和数字
    【解决方案7】:

    这是我的解决方案:

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

    试试吧!

    【讨论】:

      【解决方案8】:

      我用它来增加/减少条形码

      /// <summary>
      /// Gets the number portion of the string and adds 1 to it
      /// </summary>
      public static string IncrementNumbers(this string numString)
      {
        if (numString.IsEmpty())
          return numString;
        else if (!numString.Where(Char.IsDigit).Any())
          return numString;
        else
        {
          string prefix = Regex.Match(numString, "^\\D+").Value;
          string number = Regex.Replace(numString, "^\\D+", "");
          int i = int.Parse(number) + 1;
          return prefix + i.ToString($"D{numString.Length - prefix.Length}");
        }
      }
      
      /// <summary>
      /// Gets the number portion of the string and subtracts 1 from it
      /// </summary>
      public static string DecrementNumbers(this string numString)
      {
        if (numString.IsEmpty())
          return numString;
        else if (!numString.Where(Char.IsDigit).Any())
          return numString;
        else
        {
          string prefix = Regex.Match(numString, "^\\D+").Value;
          string number = Regex.Replace(numString, "^\\D+", "");
          int i = int.Parse(number) - 1;
          return prefix + i.ToString($"D{numString.Length - prefix.Length}");
        }
      }
      
      /// <summary>
      /// Shortented IsNullOrWhiteSpace 
      /// </summary>
      public static bool IsEmpty(this string str)
      {
        if (str.TrimFix() == null)
          return true;
      
        return false;
      }
      
      /// <summary>
      /// Trims the String and returns Null if it's empty space
      /// </summary>
      public static string TrimFix(this string rawString)
      {
        if (!string.IsNullOrWhiteSpace(rawString))
        {
          return rawString.Trim();
        }
        return null;
      }
      

      【讨论】:

        【解决方案9】:

        如果字符串中间有数字,则接受的答案不起作用,例如XXX123YYY456,抛出异常。
        我写了一个通用方法,它会增加字符串的结尾,你可以传递给它最少的位数。

        public static string IncrementStringEnd(string name, int minNumericalCharacters = 1)
                {
                    var prefix = System.Text.RegularExpressions.Regex.Match(name, @"\d+$");
                    if (prefix.Success)
                    {
                        var capture = prefix.Captures[0];
                        int number = int.Parse(capture.Value) + 1;
                        name = name.Remove(capture.Index, capture.Length) + number.ToString("D" + minNumericalCharacters);
                    }
        
                    return name;
                }
        

        测试结果:
        MD00494 : MD00495
        XXX123YYY456 : XXX123YYY457
        SD50MRF999 : SD50MRF1000
        SD50MRF9 : SD50MRF010
        用于测试目的https://dotnetfiddle.net/j1f6wh

        【讨论】:

          猜你喜欢
          • 2020-02-24
          • 1970-01-01
          • 2013-05-27
          • 1970-01-01
          • 1970-01-01
          • 2015-05-26
          • 1970-01-01
          • 1970-01-01
          • 2019-02-17
          相关资源
          最近更新 更多