2010-10-19 108 views
6

我有一个压缩的字符串值,我从导入文件中提取。我需要将其格式化为包裹编号,格式如下:##-##-##-###-###。因此,字符串“410151000640”应该变成“41-01-51-000-640”。我可以用下面的代码来做到这一点:带破折号的格式字符串

String.Format("{0:##-##-##-###-###}", Convert.ToInt64("410151000640")); 

但是,字符串可能不是所有的数字;它可能有一个或两个字母,因此转换为int将失败。有没有办法在一个字符串上做到这一点,所以每个字符,不管它是数字还是字母,都能正确适应格式?

回答

19
Regex.Replace("410151000640", @"^(.{2})(.{2})(.{2})(.{3})(.{3})$", "$1-$2-$3-$4-$5"); 

还是略短版

Regex.Replace("410151000640", @"^(..)(..)(..)(...)(...)$", "$1-$2-$3-$4-$5"); 
+0

工程就像一个魅力!我将这个提取到一个包装方法中,并进行了一些验证和错误处理。谢谢! – Kevin 2010-10-19 13:50:32

+0

我必须真正自己学习正则表达式。这个问题的一个非常好的解决方案。 – 2010-10-19 13:54:52

+1

@Øyvind如果有帮助,我喜欢使用http://www.regular-expressions.info/tutorial.html以供参考。他们还讨论了不同引擎提供的不同正则表达式风格。 – 2010-10-19 14:21:56

3

这应该工作你的情况:

string value = "410151000640"; 
for(int i = 2; i < value.Length; i+=3){ 
    value = value.Insert(i, "-"); 
} 

现在value包含插入破折号的字符串。

编辑

我刚才看到你没有每秒数之间划了一路,这将需要一个小调整(并使其更笨拙一点也恐怕)

string value = "410151000640"; 
for(int i = 2; i < value.Length-1; i+=3){ 
    if(value.Count(c => c == '-') >= 3) i++; 
    value = value.Insert(i, "-"); 
} 
8

只要您知道“宗地编号”始终符合特定规则,我就可以通过拥有自己的格式化方法来解决此问题。

public static string FormatParcelNumber(string input) 
{ 
    if(input.length != 12) 
    throw new FormatException("Invalid parcel number. Must be 12 characters"); 

    return String.Format("{0}-{1}-{2}-{3}-{4}", 
       input.Substring(0,2), 
       input.Substring(2,2), 
       input.Substring(4,2), 
       input.Substring(6,3), 
       input.Substring(9,3)); 
} 
0

如果我正确地理解了你,你正在寻找一个从字符串中删除所有字母的函数,不是吗?

我创造了这个在飞行中,也许你可以把它转换成C#的,如果这是你在找什么:

Dim str As String = "410151000vb640" 
str = String.Format("{0:##-##-##-###-###}", Convert.ToInt64(MakeNumber(str))) 


Public Function MakeNumber(ByVal stringInt As String) As String 
    Dim sb As New System.Text.StringBuilder 
    For i As Int32 = 0 To stringInt.Length - 1 
     If Char.IsDigit(stringInt(i)) Then 
      sb.Append(stringInt(i)) 
     End If 
    Next 
    Return sb.ToString 
End Function 
+0

不,这些字母也包含在包裹编号中,例如“410151000vb6”应该变成“41-01-51-000-vb6” – Kevin 2010-10-19 13:49:42

1

如果它的用户界面的一部分,您可以在System.ComponentModel

MaskedTextProvider prov = new MaskedTextProvider("aa-aa-aa-aaa-aaa"); 
    prov.Set("41x151000a40"); 
    string result = prov.ToDisplayString(); 
使用 MaskedTextProvider
+0

掩码中的“a”不应该是'&'吗? 'a'是字母数字,可选。它将接受的唯一字符是ASCII字母a-z和A-Z。 http://msdn.microsoft.com/en-us/library/system.windows.forms.maskedtextbox.mask.aspx – 2013-02-12 10:05:20

相关问题