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

82

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

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

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

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

mrroboaat
источник
возможный дубликат Получения телефонного кода страны с Android
Саймон
См. Также stackoverflow.com/questions/2530377/…
Саймон
1
Первая ссылка основана на телефонном коде страны. Но в моем случае у меня может быть строка, которая представляет собой французский телефонный номер с английским телефоном. Поэтому, если я получу текущий языковой стандарт, у меня будет «EN», но моя строка будет кодом страны для
Франции

Ответы:

128

Хорошо, поэтому я присоединился к группе 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());
}
mrroboaat
источник
6
эта безумная библиотека wackadoo потрясающая и в миллиард раз лучше, чем включенная sбиблиотека PhoneNumberUtil в android
Aphex
@aat, не могли бы вы мне рассказать, как это будет работать без использования countryISOCode в (phoneUtil.parse (phone, "");) ваш ответ, пожалуйста, ответьте
Ash
1
@Shweta Если у вас есть вопрос, опубликуйте его в новой теме на SO
mrroboaat
1
@aat, хорошо, но ваш ответ неверен, без указания страныISOCode этот код не будет выполнен
Эш
3
Параметр @Schweta defaultRegion должен иметь значение null: defaultRegion - двухбуквенный код региона ISO 3166-1, обозначающий регион, из которого мы ожидаем получить номер. Это используется только в том случае, если анализируемый номер не записан в международном формате. Country_code для номера в этом случае будет сохранен как регион по умолчанию. Если гарантировано, что номер начинается со знака «+», за которым следует телефонный код страны, тогда можно указать «ZZ» или ноль.
xnagyg
3

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

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

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

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

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

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

Тилина Рубасингха
источник
1
что такое internationalFormatPhoneNumberDataType и phoneUtil
Kartheek
1
параметр givenPhoneNumber не является строкой, это должен быть уже проанализированный телефонный номер, в котором вам нужен регион по умолчанию для генерации
Gil SH
@GilSH да givenPhoneNumber не String, это объект PhoneNumber.
Thilina Rubasingha 05
1
этот ответ мне помогает
luttu android
что дается PhoneNumber ??
TharakaNirmana
3

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

Импорт:

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) {
            ""
        }
    }
Али Наваз
источник
0

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

try { 

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

}catch(e){}
Сони Кумари
источник
0

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

Питер Хубер
источник
-5

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

Yjajkiew
источник
Существует много разных кодов стран: http://en.wikipedia.org/wiki/List_of_country_calling_codes
mrroboaat
-24

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

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

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

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

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