Используйте libphonenumber для проверки номера мобильного телефона, не зная страны

У меня есть список (строка) телефонных номеров из любой страны.

Например:

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

сначала я думаю, что длина кода каждой страны - это ровно два числа, например (33: Франция, 39: Италия, 98: Иран, ...).

используя библиотеку libphonenumber, вы должны передать regCode для синтаксического анализа. и из-за того, что (в моем сценарии) я получаю список строк (номер мобильного телефона), тогда я должен быть отдельным кодом страны от номера.

       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 (или других решений) для решения этой проблемы?

большое спасибо


person KoKo    schedule 05.10.2016    source источник
comment
Это не по теме, так как вы запрашиваете ресурсы за пределами сайта. Кроме того, постоянная проверка форматов телефонных номеров может иметь ограниченное количество причин. Если пользователь не хочет предоставлять реальный номер телефона, они его просто придумают.   -  person David L    schedule 05.10.2016
comment
Первая часть вашего вопроса тривиальна, чтобы доказать неверность - в большинстве стран используются трехзначные телефонные коды, в некоторых - 4, 5 и даже 6: en.wikipedia.org/wiki/List_of_country_calling_codes   -  person Jamiec    schedule 05.10.2016
comment
Их страница на github ссылается на этот веб-сайт в качестве демонстрации libphonenumber.appspot.com, а в их демонстрации говорится об использовании ISO 3166. -1 двухбуквенный код страны и ссылки здесь: iso.org/iso/english_country_names_and_code_elements. Так что, возможно, попробуйте использовать эти двухсимвольные буквенные коды вместо числовых кодов из 1–3 цифр. Например, попробуйте использовать US для соединенных штатов вместо 840.   -  person Quantic    schedule 05.10.2016


Ответы (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; 
}
person NineBerry    schedule 05.10.2016
comment
как проверить только мобильные номера? - person FrenkyB; 12.08.2019

Вы можете использовать дату в этом пакете https://www.npmjs.com/package/dialcodes

person Nikitin Vitaly    schedule 25.10.2016