2008-10-09 104 views
0

我有一個用於電話號碼字段的.NET WinForms文本框。在允許自由格式文本之後,我想在用戶離開文本框後將文本格式設置爲「更易讀」的電話號碼。 (Outlook有此功能,當您創建/編輯聯繫人電話字段)電話號碼格式化,OnBlur

  • 1234567變得123-4567
  • 1234567890成爲(123)456-7890
  • (123)456.7890變成(123)456 -7890
  • 123.4567x123變得123-4567 X123

回答

0

我不知道的比可能使一些口罩和檢查自己做其他任何方式哪一個匹配,並在每個案件的基礎上做每個掩碼。不要認爲它太困難,只是費時。

0

我的猜測是你可以用條件語句來完成這個查看輸入然後解析成特定格式。但我猜測將會有大量的邏輯來研究輸入和格式化輸出。

2

一個相當簡單的方法是使用正則表達式。根據您接受的電話號碼類型,您可以編寫一個查找數字的正則表達式(僅適用於美國,您知道總共可以有7個或10個 - 可能帶有一個前導'1')和潛在分隔符他們之間(週期,短跑,parens,空間等)。

一旦您對正則表達式運行匹配,您需要編寫邏輯來確定您實際得到的內容並將其格式化。

編輯:只是想添加一個非常基本的例子(絕不是這將工作的所有上面張貼的例子)。根據您編寫正則表達式的方式,Geoff建議刪除非數字字符可能會有所幫助。

Regex regex = new Regex(@"(?<areaCode>([\d]{3}))?[\s.-]?(?<leadingThree>([\d]{3}))[\s.-]?(?<lastFour>([\d]{4}))[x]?(?<extension>[\d]{1,})?"); 
string phoneNumber = "701 123-4567x324"; 

Match phoneNumberMatch = regex.Match(phoneNumber); 
if(phoneNumberMatch.Success) 
{ 
    if (phoneNumberMatch.Groups["areaCode"].Success) 
    { 
     Console.WriteLine(phoneNumberMatch.Groups["areaCode"].Value); 
    } 
    if (phoneNumberMatch.Groups["leadingThree"].Success) 
    { 
     Console.WriteLine(phoneNumberMatch.Groups["leadingThree"].Value); 
    } 
    if (phoneNumberMatch.Groups["lastFour"].Success) 
    { 
     Console.WriteLine(phoneNumberMatch.Groups["lastFour"].Value); 
    } 
    if (phoneNumberMatch.Groups["extension"].Success) 
    { 
     Console.WriteLine(phoneNumberMatch.Groups["extension"].Value); 
    } 
} 
1

我認爲最簡單的辦法是首先從字符串中去掉任何非數字字符,這樣你只需要一個號碼,然後格式,在此question

+0

我想到了剝離非數字字符,然後格式化,但我不認爲這麼好了擴展案例(123.4567x123) – 2008-10-10 12:54:32

1

提到我想到了剝離任何非 - 數字字符然後格式化,但我不認爲這對擴展案例效果很好(123.4567x123)

1

取消擴展名,然後從其餘字符中去除非數字字符。格式化它,然後重新添加擴展名。

Start: 123.4567x123 
Lop: 123.4567 
Strip: 1234567 
Format: 123-4567 
Add: 123-4567 x123 
0

這適用於我。值得一試的性能,如果你是在一個緊湊的循環做這個...

public static string FormatPhoneNumber(string phone) 
{ 
    phone = Regex.Replace(phone, @"[^\d]", ""); 
    if (phone.Length == 10) 
     return Regex.Replace(phone, 
          "(?<ac>\\d{3})(?<pref>\\d{3})(?<num>\\d{4})", 
          "(${ac}) ${pref}-${num}"); 
    else if ((phone.Length < 16) && (phone.Length > 10)) 
     return Regex.Replace(phone, 
          "(?<ac>\\d{3})(?<pref>\\d{3})(?<num>\\d{4})(?<ext>\\d{1,5})", 
          "(${ac}) ${pref}-${num} x${ext}"); 
    else 
     return string.Empty; 

}