增加字符串中的数字(C#)

时间:2010-10-04 20:41:19

标签: c# string

我的字符串末尾有一个数字,后面是短划线(“ - ”)。我想用这个数字增加1创建相同的字符串。很简单,但我想知道是否有更好的方法呢?谢谢!

string oldString = "BA-0001-3";
int lastIndex = oldString.LastIndexOf("-");
string oldNumber = oldString.SubString(lastIndex + 1);
string oldPartialString = oldString.SubString(0, lastIndex);
int newNumber = Convert.ToInt32(oldNumber) + 1;

string newString = oldPartialString + newNumber.ToString();

6 个答案:

答案 0 :(得分:7)

Regex

示例:

Regex.Replace("BA-0001-3", @"[A-Z]{2}-\d{4}-(\d+)", 
    m => (Convert.ToInt32(m.Groups[1].Value) + 1).ToString())

答案 1 :(得分:7)

我可能会使用我的朋友string.Split

string oldString = "BA-0001-3";
string[] parts = oldString.Split('-');
parts[parts.Length-1] = (Convert.ToInt32(parts[parts.Length-1])+1).ToString();
string newString = string.Join("-", parts);

一个小的调整,可能会更快(通过访问parts.Length并减去1只一次 - 没有描述,所以它纯粹是一个猜测,并且它可能是一个边际差异,但最重要的是)健壮(使用int.TryParse):

string oldString = "BA-0001-3";
string[] parts = oldString.Split('-');
int number;
int lastIndex = parts.Length-1;
parts[lastIndex] = (int.TryParse(parts[lastIndex], out number) ? ++number : 1).ToString();
string newString = string.Join("-", parts);

答案 2 :(得分:2)

根据Ahmad Mageed的评论更新如下。这是他现在的答案: - )

我会按照你现在的方式做到这一点,但为了好玩,我想知道我是否可以用linq做到这一点。

var x = "BA-0001-3".Split('-');

var y = x.First() + "-" + x.ElementAt(1) + "-" + (Convert.ToInt32(x.Last()) + 1);

这适用于LINQPad。

编辑:显然我不是linq的专业人士。希望有关如何改进的答案/评论。

答案 3 :(得分:1)

这是一个如何用RegEx完成的例子:

public void Test()
{
    System.Text.RegularExpressions.Regex rx = new Regex(@"(?<prefix>.*\-)(?<digit>\d+)");
    string input = "BA-0001-3";
    string output = string.Empty;

    int digit = 0;
    if (int.TryParse(rx.Replace(input, "${digit}"), out digit))
    {
        output = rx.Replace(input, "${prefix}" + (digit + 1));
    }
    Console.WriteLine(output);
}

答案 4 :(得分:1)

使用正则表达式(现在似乎已经填充了更多细节)我最终会得到类似的结果:

var regex = new Regex(@"^(?<Category>[A-Za-z]{1,2})-(?<Code>[0-9]{4})-(?<Number>[0-9]+)$");
var newCode = regex.Replace("BA-0001-3", new MatchEvaluator(ReplaceWithIncrementedNumber));

MatchEvaluator函数的位置为:

public static string ReplaceWithIncrementedNumber(Match match)
{
    Debug.Assert(match.Success);
    var number = Int32.Parse(match.Groups["Number"].Value);
    return String.Format("{0}-{1}-{2}", match.Groups["Category"].Value, match.Groups["Code"].Value, number + 1);
}

答案 5 :(得分:0)

这是一个暴露“部件号”的三个部分的类的示例。不是特别花哨(也注意没有错误检查/验证)。

  class Program
  {
    static void Main(string[] args)
    {
      PartNumber p1 = new PartNumber("BA-0001-3");
      for (int i = 0; i < 5; i++)
      {
        p1.Sub++;
        Debug.WriteLine(p1);
      }

      PartNumber p2 = new PartNumber("BA", 2, 3);
      for (int i = 0; i < 5; i++)
      {
        p2.Sub++;
        Debug.WriteLine(p2);
      }

    }
  }

  class PartNumber
  {
    public PartNumber(string make, int model, int sub)
    {
      Make = make;
      Model = model;
      Sub = sub;
    }

    public PartNumber(string part)
    {
      //Might want to validate the string here
      string [] fields = part.Split('-');

      //Are there 3 fields?  Are second and third fields valid ints?
      Make = fields[0];
      Model = Int32.Parse(fields[1]);
      Sub = Int32.Parse(fields[2]);
    }

    public string Make { get; set; }
    public int Model { get; set; }
    public int Sub { get; set; }

    public override string ToString()
    {
      return string.Format("{0}-{1:D4}-{2}", Make, Model, Sub);
    }
  }