2016-10-05 87 views
0

我有一個來自任何國家的電話號碼列表(字符串)。使用libphonenumber來驗證手機號碼而不知道國家

例如:

var items = new List<string> { "+989302794433", "009891234599882", "+391234567890", "00336615551212"};

起初,我認爲每個國家代碼的長度恰好是兩個數,例如(33:法國,39:意大利,98:伊朗,... )。使用libphonenumber

,你必須通過註冊碼解析。並因爲(在我的情況下)我得到的字符串(手機號碼)的列表,那麼我必須從數字分開的國家代碼。

 foreach (var item in items) 
     { 
      int countryCode = 0; 
      var number = ""; 

      if (item.StartsWith("+")) 
      { 
       countryCode = int.Parse(item.Substring(1, 2)); 
       number = item.Substring(3); 
      } 
      else if (item.StartsWith("00")) 
      { 
       countryCode = int.Parse(item.Substring(2, 2)); 
       number = item.Substring(4); 
      } 
      var regCode = phoneUtil.GetRegionCodeForCountryCode(countryCode); 

      var numberWithRegCode = phoneUtil.Parse(number, regCode); 

      if (!phoneUtil.IsValidNumber(numberWithRegCode)) continue; 
      //else ... 
     } 

此代碼罰款只適用於國家代碼,他們的長度是兩個數字!

但經過一段時間,我知道一些國家代碼長度是一個數字(例如,美國:1),甚至三個數字!

現在,是否存在任何方式使用libphonenumber庫(或其他解決方案)來解決這個問題?

非常感謝

+1

這是題外話,因爲您請求異地資源。另外,始終驗證電話號碼格式的原因可能有限。如果用戶不想提供一個真實的電話號碼,他們只會提出一個。 –

+0

你的問題的第一部分是微不足道的證明不正確 - 大多數國家使用3位撥號代碼,有些使用4,5甚至6:https://en.wikipedia.org/wiki/List_of_country_calling_codes – Jamiec

+0

他們的github頁面鏈接到這個網站作爲演示https://libphonenumber.appspot.com/和他們的演示聲稱使用「ISO 3166-1雙字母國家代碼」和鏈接:http://www.iso.org/iso/english_country_names_and_code_elements。因此,也許嘗試使用這些2個字符的字母代碼而不是1-3位數字代碼。例如,嘗試使用「美國」而不是「840」來代替美國。 – Quantic

回答

2

的libphonenumber庫可以自己只要數以+開始找到國家代碼。所以,在一個數字的開頭用一個加號替換兩個零。然後讓圖書館自行決定數字是否有效。

libphonenumber將自己知道加號後面的國家代碼(它在內部有一個所有代碼的列表),然後根據正確的國家/地區應用規則以確定該號碼是否有效。

bool IsValidNumber(string aNumber) 
{ 
    bool result = false; 

    aNumber = aNumber.Trim(); 

    if (aNumber.StartsWith("00")) 
    { 
     // Replace 00 at beginning with + 
     aNumber = "+" + aNumber.Remove(0, 2); 
    } 

    try 
    { 
     result = PhoneNumberUtil.Instance.Parse(aNumber, "").IsValidNumber; 
    } 
    catch 
    { 
     // Exception means is no valid number 
    } 

    return result; 
}