2012-06-26 36 views
5

Tôi có một danh sách các số điện thoại nhập vào bởi người sử dụng mà không cần xác nhận và họ trông giống như:số điện thoại Normalize sử dụng regex

- 495) 995-0595 
- 105-6439 
- 095 268 8621 
- 324-51-44 
- 7 (495) 995-05-95 
- 7 495 995 05 95 
- 7 (495) 995-0595 
- +7 (495) 995-05-95 
- 7 (495)925-34-89 
- 7(495)9253489 
- 7(495)925-34-89 
- 74959950595 

Tôi muốn chuyển đổi những con số này vào này định dạng (Nga): + X (XXX) XXX-XX-XX

Có cơ hội nào để đạt được điều đó bằng cách sử dụng cụm từ thông dụng không?

+0

Tôi đoán bạn nên đặt xác nhận khi người dùng đang nhập dữ liệu. –

+1

Đã quá muộn. Tôi có hàng ngàn người trong số họ bây giờ. – Roman

+6

có vẻ như bạn chỉ có hai kịch bản, 7 chữ số và 11 chữ số. định dạng sang một bên, trước tiên bạn sẽ loại bỏ tất cả định dạng khỏi danh sách của mình và lưu trữ dưới dạng số thuần túy. sau đó định dạng nó bao giờ theo cách bạn muốn với string.format – Joe

Trả lời

3

Yup, Trích xuất & Cải cách!

List<string> oldlist = new List<string>(); 
List<string> newlist = new List<string>(); 
foreach(string s in oldlist) 
{ 
    if(s.Contains('(')) s = s.Replace('('), "");//etc 
    newlist.Add(numFormat(s)); 
} 

string prefix = "495"; 

string numFormat(string s) 
{ 
    string my; 
    if(s.Length == 7) 
    { 
     my = string.Format("+7 ({0}) {1} {2} {3}", prefix, s.substring(0,3), s.subtring(3,2), s.substring(5,2); 
    } 
    else if(s.length == 10) 
    { 
     my = string.Format("+7 ({0}) {1} {2} {3}", s.substring(0,3), s.substring(3,3), s.subtring(5,2), s.substring(7,2);   
    } 
    //etc 
    return my; 
} 

Đây chỉ là ra khỏi đỉnh đầu của tôi ... nhưng bạn sẽ có được ý tưởng

1

Tôi nghĩ rằng bạn nên làm điều này

  1. Chuyển nó sang chuỗi.
  2. Sử dụng vòng lặp xóa mọi thứ không giống như số. Bạn có thể sử dụng Char.IsDigit() cho việc này.
  3. Sau đó, hãy định dạng mong muốn của bạn bằng cách sử dụng string.Substring().

Đảm bảo bạn thực hiện tất cả các bước này ở định dạng chuỗi.

Giống như

string str = "495) 995-0595"; 
List<char> digits = new List<char>(); 

for (int i = 0; i < str.Length; i++) 
{ 
    if(char.IsDigit(str[i])) 
     digits.Add(str[i]); 
} 

str = new string(digits.ToArray()); 

str = "+" + str.Substring(0, 1) + " (" + str.Substring(1, 3) + ") " 
     + str.Substring(4, 2) + "-" + str.Substring(6, 2) + "-" + str.Substring(8); 

này trở tôi "+4 (959) 95-05-95"

+0

Vấn đề là dấu ngoặc tròn mất tích trong 495) xác định mã số thành phố. Vì vậy, tôi phải sửa lỗi này cũng để có được số điện thoại trong XXX-XX-XX – Roman

+2

tôi nghĩ bạn sẽ tìm thấy trong cả Nikhil và giải pháp của tôi mà chúng tôi bỏ qua tất cả các định dạng xấu. tước các định dạng là rất nhiều dễ dàng hơn 'sửa chữa' định dạng. Chỉ cần lấy các số và sau đó ghi đè lên nó ở định dạng đúng. Đừng nghĩ đến việc cố gắng sửa từng trường hợp định dạng riêng lẻ, có khả năng vô hạn các trường hợp xấu. – Joe

+0

@Joe: +1 nhận xét của bạn. "Tước định dạng dễ hơn rất nhiều so với 'sửa' định dạng". Phải –

0

Something như thế:

(\d)? ?\(?(\d\d\d)?\)? *?(\d\d\d) *?-? *?(\d\d) *?-? *?(\d\d) 
2

Chạy danh sách của bạn thông qua này:

var strippedNumbers = new List<string>(); 
foreach (var num in listOfRussianNumbers.Select(x=>Regex.Replace(x, "[^0-9]", ""))) 
    strippedNumbers.Add(num.Length == 7?"7499"+num:num); 

Sau đó sử dụng string.Format để in ra cách bạn muốn

string.Format("+{0} ({1}) {2}-{3}-{4}", 
    num.Substring(0,1), 
    num.Substring(1,3), 
num.Substring(4,3), 
num.Substring(7,2), 
num.Substring(9,2)); 
+0

3 số cuối cùng phải là 'num.Substring (4,2), num.Substring (6,2), num.Substring (8,2)); ' –

+0

nope, tôi nghĩ rằng ur thiếu số đầu tiên, vì vậy tất cả các chuỗi ur là 1 char off :) – Joe

+0

Có nhớ rằng Xin lỗi. –

1

Đây là điều tốt nhất tôi có thể nhận được trong thông báo ngắn.

((\+?\d)\s?)?\(?(\d\d\d)\)?\s?(\d\d\d)(\s|-)?(\d\d)(\s|-)?(\d\d) 

Điều này sẽ chọn in đậm từ mẫu của bạn.

495) 995-0595
105-6439

324-51-44
7 (495) 995-05-95

7 (495) 995-0595
+7 (495) 995-05-95
7 (495) 925-34-89
7 (495) 9253489
7 (495) 925-34-89

Trên chuỗi không phù hợp, bạn có thể gửi chúng thông qua một thói quen khác hoặc để xử lý thủ công.

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