Извлечь код страны из номера телефона [libphonenumber]

У меня есть такая строка: +33123456789 (французский номер телефона). Я хочу извлечь код страны (+33), не зная страны. Например, он должен работать, если у меня есть еще один телефон из другой страны. Я использую библиотеку Google https://code.google.com/p/libphonenumber/.

Если я знаю страну, это круто, я могу найти код страны:

PhoneNumberUtil phoneUtil = PhoneNumberUtil.getInstance();
int countryCode = phoneUtil.getCountryCodeForRegion(locale.getCountry());

но я не могу найти способ разобрать строку, не зная страны.


person mrroboaat    schedule 29.05.2013    source источник
comment
возможный дубликат Получение телефонного кода страны с Android   -  person Simon    schedule 29.05.2013
comment
См. Также stackoverflow.com/questions/2530377/   -  person Simon    schedule 29.05.2013
comment
Первая ссылка основана на телефонном коде страны. Но в моем случае у меня может быть строка, которая представляет собой французский телефонный номер с английским телефоном. Поэтому, если я получу текущий языковой стандарт, у меня будет EN, но моя строка будет кодом страны для Франции.   -  person mrroboaat    schedule 29.05.2013


Ответы (7)


Итак, я присоединился к группе 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());
}
person mrroboaat    schedule 30.05.2013
comment
эта сумасшедшая библиотека wackadoo потрясающая и в миллиард раз лучше, чем включенная библиотека PhoneNumberUtils в Android - person Aphex; 23.10.2014
comment
@aat, не могли бы вы рассказать мне, как это будет работать без использования countryISOCode в (phoneUtil.parse (phone,);) в вашем ответе, пожалуйста, ответьте - person Ash; 04.11.2014
comment
@Shweta Если у вас есть вопрос, опубликуйте его в новой теме на SO - person mrroboaat; 04.11.2014
comment
@aat нормально, но ваш ответ неверен, без указания страныISOCode этот код не будет выполняться - person Ash; 05.11.2014
comment
Параметр @Schweta defaultRegion должен иметь значение null: defaultRegion - двухбуквенный код региона ISO 3166-1, обозначающий регион, из которого мы ожидаем получить номер. Это используется только в том случае, если анализируемый номер не записан в международном формате. Country_code для номера в этом случае будет сохранен как регион по умолчанию. Если гарантировано, что номер начинается со знака «+», за которым следует телефонный код страны, тогда можно указать ZZ или null. - person xnagyg; 15.01.2015
comment
Что мне делать, если мне нужно преобразовать номер телефона из моей телефонной книги в формат E164, а региональные параметры телефона могут измениться (например, когда пользователь телефона уезжает в другую страну). Я также знаю, что большинство чисел записано не в формате + ..... - person user2924714; 01.11.2016
comment
@Aphex PhoneNumberUtils внутренне использует ту же библиотеку: D - person CoDe; 03.11.2017

Здесь вы можете сохранить номер телефона как номер телефона в международном формате.

internationalFormatPhoneNumber = phoneUtil.format(givenPhoneNumber, PhoneNumberFormat.INTERNATIONAL);

он возвращает номер телефона в международном формате +94 71560 4888

так что теперь я получил код страны как этот

String countryCode = internationalFormatPhoneNumber.substring(0,internationalFormatPhoneNumber.indexOf('')).replace('+', ' ').trim();

Надеюсь, что это поможет вам

person Thilina Rubasingha    schedule 30.05.2013
comment
что такое internationalFormatPhoneNumber DataType и phoneUtil - person Kartheek s; 13.11.2013
comment
параметр givenPhoneNumber не является строкой, это должен быть уже проанализированный номер телефона, в котором вам нужен регион по умолчанию для генерации - person Gil SH; 05.02.2014
comment
@GilSH да givenPhoneNumber не String, это объект PhoneNumber. - person Thilina Rubasingha; 05.02.2014
comment
этот ответ помогает мне - person luttu android; 14.05.2014
comment
что дается PhoneNumber ?? - person TharakaNirmana; 22.07.2016
comment
Это зависит от пробела между кодом страны и остальной частью телефонного номера. Он не сможет обработать строку "+94715604888" - person Flimm; 22.11.2018

У меня есть удобный вспомогательный метод, чтобы позаботиться об этом, основываясь на одном ответе, опубликованном выше:

Импорт:

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) {
            ""
        }
    }
person Ali Nawaz    schedule 02.07.2019

Используйте блок try catch, как показано ниже:

try { 

const phoneNumber = this.phoneUtil.parseAndKeepRawInput(value, this.countryCode);

}catch(e){}
person soni kumari    schedule 10.04.2020

Вот решение, чтобы получить страну на основе международного номера телефона без использования библиотеки 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: Подробнее о проверке международного номера телефона

person Peter Huber    schedule 11.04.2020

Если строка, содержащая номер телефона, всегда будет начинаться таким образом (+33 или другой код страны), вы должны использовать регулярное выражение для синтаксического анализа и получения кода страны, а затем использовать библиотеку, чтобы получить страну, связанную с номером.

person yjajkiew    schedule 29.05.2013
comment
Существует много разных кодов стран: http://en.wikipedia.org/wiki/List_of_country_calling_codes - person mrroboaat; 29.05.2013

Вот ответ, как найти код страны без использования сторонних библиотек (как это делает настоящий разработчик):

Получить список всех доступных кодов стран, Википедия может помочь здесь: https://en.wikipedia.org/wiki/List_of_country_calling_codes

Анализируйте данные в древовидной структуре, где каждая цифра является ветвью.

Пройдите по дереву цифра за цифрой, пока не дойдете до последней ветви - это код вашей страны.

person Unobic    schedule 12.07.2016
comment
Я голосую против этого из-за этого комментария: Вот ответ, как найти телефонный код страны без использования сторонних библиотек (как это делает настоящий разработчик): Как вы думаете, почему программное обеспечение прогрессирует? Это потому, что людям не нужно каждый раз заново изобретать колесо. НАСТОЯЩИЙ разработчик использует сторонние библиотеки, потому что он умен. - person Carl B; 05.09.2016
comment
Ваше личное мнение не делает мой ответ неверным, не так ли? Фактически, это пока единственный правильный и надежный ответ ... и да, для работы не требуется никакого стороннего программного обеспечения. Вы можете купить мое решение, если настаиваете на использовании сторонних библиотек. - person Unobic; 20.06.2017
comment
Обновить библиотеку проще, чем постоянно заходить на страницу Википедии, чтобы проверить, не изменился ли список телефонных кодов страны. - person Flimm; 22.11.2018
comment
@Unobic Прости, чувак. Они не должны голосовать из-за личного мнения о Stackoverflow. Искал именно ваш ответ при поиске. Так что спасибо от меня. Получите хотя бы мою поддержку. - person Ybrin; 05.02.2020