c#从字符串中间删除零

时间:2014-09-22 22:39:56

标签: c# string c#-4.0 trim

我正在使用c#-4.0 Windows窗体应用程序,我需要从序列号中删除填充零。

我的序列存储在一个字符串中,看起来像这样 BMS21-14-000000000000000000120 ,最后的结果是 BMS21-14-120

序列号结构为:

  • BMS21 是前缀。
  • 14 是生产年份。
  • 120 是一个递增的数字。

现在,我们的前缀和递增数字的长度将随产品而变化,但结构是一致的。它始终是前缀递增#,它们总是以短划线分隔。

我尝试按照msdn列出的示例进行操作,但我无法使用它来处理序列号。

6 个答案:

答案 0 :(得分:5)

这是另一种解决方案:

static string FormatSerialNumber(string serialNumber)
{
    var parts = serialNumber.Split('-');
    parts[2] = parts[2].TrimStart('0');
    return string.Join("-", parts);
}

// Call it like this:
FormatSerialNumber("BMS21-14-000000000000000000120") // BMS21-14-120

如果您的序列号字符串可能不严格符合此格式,您可能还需要添加代码来验证此函数的输入。

答案 1 :(得分:3)

我很高兴看到你自己找到了答案。但是,这可能更短:

var parts="BMS21-14-000000000000000000120".Split('-');
var result = string.Format("{0}-{1}-{2}", parts[0], parts[1], int.Parse(parts[2]));
Console.WriteLine(result);

答案 2 :(得分:3)

这是你的单行:

var serial = "BMS21-14-000000000000000000120";
serial = Regex.Replace(serial, @"(?<=-\d+-)0+", String.Empty);

以下是解释:

  • 0+将匹配一系列零。
  • (?<=-\d+-)是一个肯定的背后隐藏(?<= ... ))。它会声明在零之前的是破折号,后跟一系列数字(\d+)和另一个破折号。作为一个断言,它本身不会匹配任何东西。如果您想确保生产年份部分由两位数组成,\d+可能会被\d{2}取代。

作为旁注,您可以在(?=\d)之后添加0+。这是一个正向前瞻,可以确保至少剩下一个数字。这样您就可以将BMS21-14-000000000000000000000缩减为BMS21-14-0而不是BMS21-14-

答案 3 :(得分:2)

string serial = "BMS21 - 14 - 000000000000000000120";

string[] splitSerial = serial.Split('-');

int code = Convert.ToInt32(splitSerial[2]);

serial = splitSerial[0] + '-' + splitSerial[1] + '-' + code.ToString();

答案 4 :(得分:1)

扩展方法:

public static string RemoveZeros(this string sn)
{
    int ndx = sn.IndexOf('-');
    ndx = sn.IndexOf('-', ndx + 1);
    int cnt = ndx + 1;
    while (sn[cnt] == '0')
    {           
        cnt++;
    }
    return sn.Remove(ndx + 1, cnt - ndx - 1);
}

像这样使用:

string serial = "BMS21-14-000000000000000000120".RemoveZeros();

答案 5 :(得分:0)

好的,我想通过this stackoverflow post来解决这个问题。

这是我的代码:

            for (int i = 0; i < _dtSerial.Rows.Count; i++)
            {
                DataRow dr = _dtSerial.Rows[i];
                string fullSer = _dtSerial.Rows[i].Field<string>("ser_num");

                //Get index for the begining of the string that needs replacing
                int foundS1 = fullSer.IndexOf("-00");

                //Get index of the first non-zero value in my string
                int foundS2 = fullSer.IndexOfAny("123456789".ToArray(), foundS1 + 1);
                if (foundS1 != foundS2 && foundS1 >= 0)
                {
                    fullSer = fullSer.Remove(foundS1 + 1, (foundS2 - foundS1) - 1);
                }
                dr["Serial"] = fullSer;
            }

获取填充零开头的索引非常简单,因为它们总是以 -00 开头,但我的问题是在第一个非零值的索引到达结尾处序列号字符串。

但后来我想出了如何使用.IndexOfAny(),它就像一个魅力。