2010-10-19 49 views
6

Tôi có một giá trị chuỗi nén mà tôi đang trích xuất từ ​​tệp nhập. Tôi cần định dạng số này thành số lô đất, được định dạng như sau: ##-##-##-###-###. Do đó, chuỗi "410151000640" sẽ trở thành "41-01-51-000-640". Tôi có thể thực hiện điều này bằng mã sau:Chuỗi định dạng có dấu gạch ngang

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

Tuy nhiên, Chuỗi có thể không phải là tất cả các số; nó có thể có một hoặc hai chữ cái trong đó, và do đó việc chuyển đổi sang int sẽ thất bại. Có cách nào để làm điều này trên một chuỗi để mọi nhân vật, bất kể nếu nó là một số hoặc chữ cái, sẽ phù hợp với định dạng chính xác?

Trả lời

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

Hoặc phiên bản hơi ngắn

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

Hoạt động như một sự quyến rũ! Tôi trích xuất này thành một phương pháp bao bọc với một số xác nhận và xử lý lỗi. Cảm ơn! – Kevin

+0

Tôi thực sự phải học Regex đúng cách. Một giải pháp rất tốt cho vấn đề này. –

+1

@ Øyvind Nếu nó giúp, tôi thích sử dụng http://www.regular-expressions.info/tutorial.html để tham khảo. Họ cũng nói về các hương vị khác nhau của regex được cung cấp bởi các công cụ khác nhau. –

3

này nên làm việc trong trường hợp của bạn:

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

Bây giờ value chứa chuỗi với dấu gạch ngang chèn vào.

EDIT

tôi chỉ là bây giờ thấy rằng bạn không có dấu gạch ngang giữa mỗi số thứ hai tất cả các cách, điều này sẽ đòi hỏi một tinh chỉnh nhỏ (và làm cho nó vụng về hơn một chút cũng Tôi sợ)

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

Tôi sẽ tiếp cận điều này bằng cách có phương pháp định dạng của riêng bạn, miễn là bạn biết rằng "Số kiện bưu kiện" luôn tuân theo quy tắc cụ thể.

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

Nếu tôi understodd bạn chính xác bạn đang tìm kiếm một chức năng loại bỏ tất cả các chữ cái từ một chuỗi, phải không?

Tôi đã tạo ra này một cách nhanh chóng, có thể bạn có thể chuyển đổi nó vào C# nếu đó là những gì bạn đang tìm kiếm:

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

Không, các chữ cái cũng được bao gồm trong số lô đất, ví dụ "410151000vb6" sẽ trở thành "41-01-51-000-vb6" – Kevin

1

Nếu một phần của giao diện người dùng, bạn có thể sử dụng MaskedTextProvider trong System.ComponentModel

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

Không phải 'a' trong mặt nạ của bạn là '&'? 'a' là chữ và số, tùy chọn. Các ký tự duy nhất nó sẽ chấp nhận là các chữ cái ASCII a-z và A-Z. http://msdn.microsoft.com/en-us/library/system.windows.forms.maskedtextbox.mask.aspx –

Các vấn đề liên quan