2010-10-19 104 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

相關問題