Извлечение страны кода из номера телефона [libphonenumber]
У меня есть строка вроде этого: +33123456789 (французский номер телефона). Я хочу извлечь код страны (+33), не зная страны. Например, он должен работать, если у меня есть другой телефон из другой страны. Я использую библиотеку google https://code.google.com/p/libphonenumber/.
Если я знаю страну, это круто, я могу найти код страны:
PhoneNumberUtil phoneUtil = PhoneNumberUtil.getInstance();
int countryCode = phoneUtil.getCountryCodeForRegion(locale.getCountry());
но я не нашел способ разобрать строку, не узнав страну.
Ответы
Ответ 1
Хорошо, поэтому я присоединился к группе 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());
}
Ответ 2
Здесь вы можете сохранить номер телефона в международном формате
internationalFormatPhoneNumber = phoneUtil.format(givenPhoneNumber, PhoneNumberFormat.INTERNATIONAL);
он возвращает номер телефона как
Международный формат +94 71 560 4888
так что теперь у меня есть код страны, как этот
String countryCode = internationalFormatPhoneNumber.substring(0,internationalFormatPhoneNumber.indexOf('')).replace('+', ' ').trim();
Надеюсь, это поможет вам
Ответ 3
У одного из наших клиентов была похожая проблема, и не все их номера телефонов начинались с "+". Но все еще часто можно угадать страну, основываясь на форматировании номера телефона... например, 06 XX XX XX XX выглядит как французский номер мобильного телефона. Это может быть что-то еще, но это работает, пытаясь проверить по французскому номеру и посмотреть, может ли libphonenumber проверить положительно.
Также этот клиент использовал контактное имя, вероятно, страну происхождения, чтобы попытаться определить приоритетность в какой стране пытаться подтвердить. Например, с итальянским именем они будут пытаться подтвердить итальянский номер телефона.
Мы добавили обнаружение кода страны в libphonenumber и создали бесплатный API, объединяющий личное имя, а также форматирование номера телефона (префикс, сколько цифр, сколько пробелов, если есть тире или скобки и т.д.)
Это можно попробовать онлайн здесь https://apiphonenumber.com/
Он будет работать с числами, начинающимися с "+", но в 95% случаев он будет работать и с другими локально отформатированными номерами.
Ответ 4
У меня есть удобный вспомогательный метод, чтобы позаботиться об этом, основываясь на одном ответе, опубликованном выше:
Импорт:
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) {
""
}
}
Ответ 5
Если строка, содержащая номер телефона, всегда будет запускаться таким образом (+33 или другой код страны), вы должны использовать регулярное выражение для разбора и получения кода страны, а затем использовать библиотеку, чтобы получить страну, связанную с номером.
Ответ 6
Вот ответ, как найти код вызова страны без использования сторонних библиотек (как это делает настоящий разработчик):
Получить список всех доступных кодов стран, Wikipedia может помочь здесь:
https://en.wikipedia.org/wiki/List_of_country_calling_codes
Разбирайте данные в древовидной структуре, где каждая цифра является ветвью.
Поверните свою цифру дерева цифрой до тех пор, пока вы не перейдете к последней ветке - это код вашей страны.