Извлечь код страны из номера телефона [libphonenumber]
У меня есть такая строка: +33123456789 (французский номер телефона). Я хочу извлечь код страны (+33), не зная страны. Например, он должен работать, если у меня есть другой телефон из другой страны. Я использую библиотеку Google https://code.google.com/p/libphonenumber/.
Если я знаю страну, это круто, я могу найти код страны:
PhoneNumberUtil phoneUtil = PhoneNumberUtil.getInstance();
int countryCode = phoneUtil.getCountryCodeForRegion(locale.getCountry());
но я не нахожу способ разобрать строку, не зная страну.
4 ответа
Итак, я присоединился к группе Google libphonenumber ( https://groups.google.com/forum/?hl=en&fromgroups) и задал вопрос.
Мне не нужно указывать страну в параметре, если мой номер телефона начинается с "+". Вот пример:
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());
}
У меня есть удобный вспомогательный метод, чтобы позаботиться об этом на основе одного ответа, опубликованного выше:
Импорт:
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) {
""
}
}
Здесь вы можете сохранить номер телефона в формате международного номера.
internationalFormatPhoneNumber = phoneUtil.format(givenPhoneNumber, PhoneNumberFormat.INTERNATIONAL);
вернуть номер телефона в международном формате +94 71 560 4888
так что теперь у меня есть код страны, как это
String countryCode = internationalFormatPhoneNumber.substring(0,internationalFormatPhoneNumber.indexOf('')).replace('+', ' ').trim();
Надеюсь, что это поможет вам
Вот решение, чтобы получить страну по международному номеру телефона без использования библиотеки 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: https://www.codeproject.com/Articles/5264561/International-Phone-Number-Validation-Explained-in
Используйте блок try catch, как показано ниже:
try {
const phoneNumber = this.phoneUtil.parseAndKeepRawInput(value, this.countryCode);
}catch(e){}
У одного из наших клиентов была похожая проблема, и не все их номера телефонов начинались с "+". Но все еще часто можно угадать страну, основываясь на форматировании номера телефона... например, 06 XX XX XX XX выглядит как французский номер мобильного телефона. Это может быть что-то еще, но это работает, пытаясь проверить по французскому номеру и посмотреть, может ли libphonenumber проверить положительно.
Также этот клиент использовал имя контакта, вероятно, страну происхождения, чтобы попытаться определить приоритетность в какой стране пытаться подтвердить. Например, с итальянским именем они будут пытаться подтвердить итальянский номер телефона.
Мы добавили обнаружение кода страны в libphonenumber и создали бесплатный API, объединяющий личное имя, а также форматирование номера телефона (префикс, сколько цифр, сколько пробелов, если есть тире или скобки и т. Д.)
Это можно попробовать онлайн здесь https://apiphonenumber.com/
Он будет работать с числами, начинающимися с "+", но в 95% случаев он будет работать и с другими локально отформатированными номерами.
Если строка, содержащая номер телефона, всегда начинается таким образом (+33 или другой код страны), вы должны использовать regex для анализа и получения кода страны, а затем использовать библиотеку для получения страны, связанной с номером.
Вот ответ, как найти код вызова страны без использования сторонних библиотек (как это делает настоящий разработчик):
Получить список всех доступных кодов стран, Википедия может помочь здесь: https://en.wikipedia.org/wiki/List_of_country_calling_codes
Анализировать данные в древовидной структуре, где каждая цифра является ветвью.
Пройдите по дереву цифра за цифрой, пока не дойдете до последней ветви - это код вашей страны.