Витяг коду країни з номера телефону [libphonenumber]


82

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

Якщо я знаю країну, це круто, я можу знайти код країни:

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

але я не знаходжу способу проаналізувати рядок, не знаючи країни.




1
Перше посилання базується на телефонному коді країни. Але в моєму випадку я можу мати рядок, який є французьким номером телефону з англійським телефоном. Отже, якщо я отримаю поточну локаль, у мене буде "EN", але моїм рядком буде французький код країни
mrroboaat

Відповіді:


128

Добре, отже, я приєднався до гугл-групи libphonenumber ( https://groups.google.com/forum/?hl=uk&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());
}

6
ця шалена бібліотека wackadoo дивовижна і в мільярд разів перевершує включену sбібліотеку PhoneNumberUtil в android
Aphex

@aat, скажіть, як це буде працювати, не використовуючи countryISOCode у (phoneUtil.parse (телефон, "");) вашій відповіді, будь ласка, дайте відповідь
Ash

1
@Shweta Якщо у вас є питання, надішліть його в новій темі на SO
mrroboaat

1
@aat гаразд, але ваша відповідь неправильна, не вказавши жодної країниISOCode Цей код не буде виконуватися
Ash Ash

3
Параметр @Schweta defaultRegion повинен бути нульовим: defaultRegion - двобуквенний регіональний код ISO 3166-1, який позначає регіон, з якого, як ми очікуємо, має бути номер. Це використовується лише в тому випадку, якщо аналізований номер написаний не в міжнародному форматі. Код країни для номера в цьому випадку буде зберігатися як код вказаного регіону за замовчуванням. Якщо номер гарантовано починається з "+", після якого йде телефонний код країни, тоді можна вказати "ZZ" або нуль.
xnagyg

3

Тут ви можете зберегти номер телефону як міжнародний відформатований номер телефону

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

він повертає номер телефону у міжнародному форматі +94 71 560 4888

так що тепер я отримав код країни як цей

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

Сподіваюся, це допоможе вам


1
що таке internationalFormatPhoneNumberDataType і phoneUtil
Kartheek s

1
заданий параметрPhoneNumber не є рядком, це повинен бути вже проаналізований номер телефону у відьмі, для створення якої вам потрібен регіон за замовчуванням
Gil SH

@GilSH так заданоPhoneNumber не String, це об'єкт PhoneNumber.
Тіліна Рубасінга

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 вирішують, це США чи Канада чи ... Не існує простого способу з’ясувати країну, як перші ХХХ - це Канада, решта США.

Для мого коду я визначив клас, який містить інформацію для постійної цифри:

public class DigitInfo {
  public char Digit;
  public Country? Country;
  public DigitInfo?[]? Digits;
}

Перший масив містить DigitInfos для першої цифри числа. Друга цифра використовується як індекс у DigitInfo.Digits. Кожен рухається вниз по цьому ланцюжку цифр, поки цифри не порожні. Якщо країна визначена (тобто не є нульовою), це значення повертається, інакше повертається будь-яка країна, визначена раніше:

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 TextBox, а бібліотека містить також інші елементи керування адресами електронної пошти тощо. Більш детальний опис наведено на CodeProject: Міжнародна перевірка телефонних номерів.


-5

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


Існує багато різних кодів країн: http://en.wikipedia.org/wiki/List_of_country_calling_codes
mrroboaat

-24

Ось відповідь, як знайти телефонний код країни без використання сторонніх бібліотек (як це робить справжній розробник):

Отримайте список усіх доступних кодів країн, Вікіпедія може допомогти тут: https://en.wikipedia.org/wiki/List_of_country_calling_codes

Проаналізуйте дані в деревній структурі, де кожна цифра є гілкою.

Переходьте свою дерев’яну цифру за цифрою, поки не дійдете до останньої гілки - це ваш код країни.


26
Я голосую за це за цей коментар: "Ось відповідь, як знайти телефонний код країни без використання сторонніх бібліотек (як це робить справжній розробник):" Чому, на вашу думку, програмне забезпечення прогресує? Це тому, що людям не доводиться кожен раз заново винаходити колесо. РЕАЛЬНИЙ розробник використовує сторонні бібліотеки, бо він розумний.
Carl B

2
Ваша особиста думка не робить мою відповідь неправильною, правда? Насправді це поки що єдина правильна та куленепробитна відповідь ... і так, для роботи не потрібне будь-яке стороннє програмне забезпечення. Ви можете придбати моє рішення, якщо наполягаєте на використанні сторонніх бібліотек.
Unobic

2
Оновити бібліотеку простіше, ніж постійно переходити на сторінку Вікіпедії, щоб перевірити, чи не змінився список телефонних кодів країн.
Флімм

@Unobic Вибач, людина. Вони не повинні голосувати через особисту думку щодо Stackoverflow. Я шукав саме вашу відповідь під час пошуку. Тож спасибі від мене. Попросіть мого голосу принаймні.
Ybrin
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.