我正在使用c#-4.0 Windows窗体应用程序,我需要从序列号中删除填充零。
我的序列存储在一个字符串中,看起来像这样 BMS21-14-000000000000000000120 ,最后的结果是 BMS21-14-120
序列号结构为:
现在,我们的前缀和递增数字的长度将随产品而变化,但结构是一致的。它始终是前缀,年和递增#,它们总是以短划线分隔。
我尝试按照msdn列出的示例进行操作,但我无法使用它来处理序列号。
答案 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()
,它就像一个魅力。