簡體   English   中英

電話號碼格式,OnBlur

[英]Phone Number Formatting, OnBlur

我有一個用於電話號碼字段的.NET WinForms文本框。 允許使用自由格式的文本后,我想在用戶離開文本框后將文本格式設置為“可讀性更高的”電話號碼。 (當您創建/編輯聯系人時,Outlook在電話字段中具有此功能)

  • 1234567變為123-4567
  • 1234567890變為(123)456-7890
  • (123)456.7890變為(123)456-7890
  • 123.4567x123變為123-4567 x123
  • 等等

一個思維簡單的方法是使用正則表達式。 根據您接受的電話號碼類型,您可以編寫一個查找數字的正則表達式(僅適用於美國,您知道總數可能是7或10-可能帶有前導'1')和可能的分隔符它們之間(句號,破折號,括號,空格等)。

一旦對正則表達式進行匹配,就需要編寫邏輯以確定實際得到的內容並從那里格式化它。

編輯:只是想添加一個非常基本的示例(絕不是這將適用於您上面發布的所有示例)。 傑夫建議剝離非數字字符可能會有所幫助,具體取決於您編寫正則表達式的方式。

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);
   }
}

我認為最簡單的方法是先從字符串中剝離所有非數字字符,以便您只有一個數字,然后按照此問題中的格式進行格式化

我曾考慮過剝離任何非數字字符然后進行格式化,但對於擴展名(123.4567x123),我認為效果不佳

刪除擴展名,然后從其余部分中去除非數字字符。 格式化它,然后重新添加擴展名。

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

這對我有用。 如果您在一個緊密的循環中進行此操作,則值得檢查性能...

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;

}

除了自己做之外,我不知道有什么其他方法,可以制作一些遮罩並檢查與之匹配的遮罩,並根據具體情況制作每個遮罩。 不要認為這太難了,只是浪費時間。

我的猜測是,您可以使用條件語句來查看輸入內容,然后將其解析為特定格式,以完成此操作。 但是我猜測將會有大量的邏輯來研究輸入並格式化輸出。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM