У меня есть такая строка: +33123456789 (французский номер телефона). Я хочу извлечь код страны (+33), не зная страны. Например, он должен работать, если у меня другой телефон из другой страны. Я использую библиотеку Google https://code.google.com/p/libphonenumber/ .
Если я знаю страну, это круто, я могу найти код страны:
PhoneNumberUtil phoneUtil = PhoneNumberUtil.getInstance();
int countryCode = phoneUtil.getCountryCodeForRegion(locale.getCountry());
но я не могу найти способ разобрать строку, не зная страны.
android
libphonenumber
mrroboaat
источник
источник
Ответы:
Хорошо, поэтому я присоединился к группе Google libphonenumber ( https://groups.google.com/forum/?hl=en&fromgroups#!forum/libphonenumber-discuss ) и задал вопрос.
Мне не нужно указывать страну в параметре, если мой номер телефона начинается с "+". Вот пример:
PhoneNumberUtil phoneUtil = PhoneNumberUtil.getInstance(); try { // phone must begin with '+' PhoneNumber numberProto = phoneUtil.parse(phone, ""); int countryCode = numberProto.getCountryCode(); } catch (NumberParseException e) { System.err.println("NumberParseException was thrown: " + e.toString()); }
источник
s
библиотека PhoneNumberUtil в androidЗдесь вы можете сохранить номер телефона как номер телефона в международном формате.
internationalFormatPhoneNumber = phoneUtil.format(givenPhoneNumber, PhoneNumberFormat.INTERNATIONAL);
он возвращает номер телефона в международном формате +94 71560 4888
так что теперь я получил код страны как этот
String countryCode = internationalFormatPhoneNumber.substring(0,internationalFormatPhoneNumber.indexOf('')).replace('+', ' ').trim();
Надеюсь, что это поможет вам
источник
internationalFormatPhoneNumber
DataType и phoneUtilУ меня есть удобный вспомогательный метод, чтобы позаботиться об этом на основе одного ответа, опубликованного выше:
Импорт:
import com.google.i18n.phonenumbers.NumberParseException import com.google.i18n.phonenumbers.PhoneNumberUtil
Функция:
fun parseCountryCode( phoneNumberStr: String?): String { val phoneUtil = PhoneNumberUtil.getInstance() return try { // phone must begin with '+' val numberProto = phoneUtil.parse(phoneNumberStr, "") numberProto.countryCode.toString() } catch (e: NumberParseException) { "" } }
источник
Используйте блок try catch, как показано ниже:
try { const phoneNumber = this.phoneUtil.parseAndKeepRawInput(value, this.countryCode); }catch(e){}
источник
Вот решение, чтобы получить страну по международному номеру телефона без использования библиотеки Google.
Позвольте мне сначала объяснить, почему так сложно определить страну. Код страны для некоторых стран состоит из 1, 2, 3 или 4 цифр. Это было бы достаточно просто. Но код страны 1 используется не только для США, но и для Канады и некоторых небольших городов:
1339 США
1340 Виргинские острова (Карибские острова)
1341 США
1342 не используется
1343 Канада
Цифры 2..4 определяют, США это или Канада или ... Нет простого способа определить страну, например, первые xxx - это Канада, а остальные - США.
Для своего кода я определил класс, который содержит информацию для всех цифр:
public class DigitInfo { public char Digit; public Country? Country; public DigitInfo?[]? Digits; }
Первый массив содержит DigitInfos для первой цифры номера. Вторая цифра используется как индекс в DigitInfo.Digits. Идут вниз по этой цепочке цифр, пока цифры не станут пустыми. Если Country определена (т.е. не null), это значение возвращается, в противном случае возвращается любая страна, определенная ранее:
country code 1: byPhone[1].Country is US country code 1236: byPhone[1].Digits[2].Digits[3].Digits[6].Country is Canada country code 1235: byPhone[1].Digits[2].Digits[3].Digits[5].Country is null. Since byPhone[1].Country is US, also 1235 is US, because no other country was found in the later digits
Вот метод, который возвращает страну на основе номера телефона:
/// <summary> /// Returns the Country based on an international dialing code. /// </summary> public static Country? GetCountry(ReadOnlySpan<char> phoneNumber) { if (phoneNumber.Length==0) return null; var isFirstDigit = true; DigitInfo? digitInfo = null; Country? country = null; foreach (var digitChar in phoneNumber) { var digitIndex = digitChar - '0'; if (isFirstDigit) { isFirstDigit = false; digitInfo = ByPhone[digitIndex]; } else { if (digitInfo!.Digits is null) return country; digitInfo = digitInfo.Digits[digitIndex]; } if (digitInfo is null) return country; country = digitInfo.Country??country; } return country; }
Остальная часть кода (digitInfos для каждой страны мира, тестовый код, ...) слишком велика, чтобы размещать ее здесь, но ее можно найти на Github: https://github.com/PeterHuberSg/WpfWindowsLib/blob /master/WpfWindowsLib/CountryCode.cs
Код является частью текстового поля WPF, а библиотека также содержит другие элементы управления для адресов электронной почты и т. Д. Более подробное описание находится в CodeProject: International Phone Number Validation Explained in Detail
источник
Если строка, содержащая номер телефона, всегда будет начинаться таким образом (+33 или другой код страны), вы должны использовать регулярное выражение для синтаксического анализа и получения кода страны, а затем использовать библиотеку, чтобы получить страну, связанную с номером.
источник
Вот ответ, как найти код страны без использования сторонних библиотек (как это делает настоящий разработчик):
Получите список всех доступных кодов стран, здесь может помочь Википедия: https://en.wikipedia.org/wiki/List_of_country_calling_codes
Анализируйте данные в древовидной структуре, где каждая цифра является ветвью.
Пройдите по дереву цифра за цифрой, пока не дойдете до последней ветви - это код вашей страны.
источник