Перейти к основному содержимому

Использование libphonenumber для проверки телефонных номеров

· 4 мин. чтения

1. Обзор

В этом кратком руководстве мы увидим, как использовать библиотеку Google с открытым исходным кодом libphonenumber для проверки телефонных номеров в Java .

2. Зависимость от Maven

Во-первых, нам нужно добавить зависимость для этой библиотеки в наш pom.xml :

<dependency>
<groupId>com.googlecode.libphonenumber</groupId>
<artifactId>libphonenumber</artifactId>
<version>8.12.10</version>
</dependency>

Информацию о последней версии можно найти на Maven Central .

Теперь мы готовы использовать все функции, которые может предложить эта библиотека.

3. PhoneNumberUtil

Библиотека предоставляет служебный класс PhoneNumberUtil , который предоставляет несколько методов для работы с телефонными номерами.

Давайте посмотрим на несколько примеров того, как мы можем использовать его различные API для проверки.

Важно отметить, что во всех примерах мы будем использовать одноэлементный объект этого класса для вызова методов :

PhoneNumberUtil phoneNumberUtil = PhoneNumberUtil.getInstance();

3.1. isPossibleNumber

Используя PhoneNumberUtil #isPossibleNumber , мы можем проверить, возможен ли данный номер для определенного кода страны или региона.

В качестве примера возьмем Соединенные Штаты, код страны которых равен 1. Мы можем проверить, являются ли заданные телефонные номера возможными номерами США, следующим образом:

@Test
public void givenPhoneNumber_whenPossible_thenValid() {
PhoneNumber number = new PhoneNumber();
number.setCountryCode(1).setNationalNumber(123000L);
assertFalse(phoneNumberUtil.isPossibleNumber(number));
assertFalse(phoneNumberUtil.isPossibleNumber("+1 343 253 00000", "US"));
assertFalse(phoneNumberUtil.isPossibleNumber("(343) 253-00000", "US"));
assertFalse(phoneNumberUtil.isPossibleNumber("dial p for pizza", "US"));
assertFalse(phoneNumberUtil.isPossibleNumber("123-000", "US"));
}

Здесь мы также использовали другой вариант этой функции, передав область , из которой мы ожидаем, что номер будет набран, как строку .

3.2. isPossibleNumberForType

Библиотека распознает различные типы телефонных номеров, такие как стационарные, мобильные, бесплатные, голосовая почта, VoIP, пейджер и многие другие .

Его служебный метод isPossibleNumberForType проверяет, возможно ли данное число для данного типа в конкретном регионе.

В качестве примера возьмем Аргентину, поскольку она допускает различную возможную длину чисел для разных типов.

Следовательно, мы можем использовать его для демонстрации возможностей этого API:

@Test
public void givenPhoneNumber_whenPossibleForType_thenValid() {
PhoneNumber number = new PhoneNumber();
number.setCountryCode(54);

number.setNationalNumber(123456);
assertTrue(phoneNumberUtil.isPossibleNumberForType(number, PhoneNumberType.FIXED_LINE));
assertFalse(phoneNumberUtil.isPossibleNumberForType(number, PhoneNumberType.TOLL_FREE));

number.setNationalNumber(12345678901L);
assertFalse(phoneNumberUtil.isPossibleNumberForType(number, PhoneNumberType.FIXED_LINE));
assertTrue(phoneNumberUtil.isPossibleNumberForType(number, PhoneNumberType.MOBILE));
assertFalse(phoneNumberUtil.isPossibleNumberForType(number, PhoneNumberType.TOLL_FREE));
}

Как мы видим, приведенный выше код подтверждает, что Аргентина разрешает 6-значные номера фиксированной связи и 11-значные номера мобильных телефонов.

3.3. isAlphaNumber

Этот метод используется для проверки того, является ли данный номер телефона допустимым буквенно-цифровым, например, 325-CARS :

@Test
public void givenPhoneNumber_whenAlphaNumber_thenValid() {
assertTrue(phoneNumberUtil.isAlphaNumber("325-CARS"));
assertTrue(phoneNumberUtil.isAlphaNumber("0800 REPAIR"));
assertTrue(phoneNumberUtil.isAlphaNumber("1-800-MY-APPLE"));
assertTrue(phoneNumberUtil.isAlphaNumber("1-800-MY-APPLE.."));
assertFalse(phoneNumberUtil.isAlphaNumber("+876 1234-1234"));
}

Чтобы уточнить, действительный альфа-число содержит по крайней мере три цифры в начале, за которыми следуют три или более буквы алфавита. Служебный метод, описанный выше, сначала очищает данный вход от любого форматирования, а затем проверяет это условие.

3.4. Исвалиднумбер

Предыдущий API, который мы обсуждали, быстро проверяет номер телефона только на основе его длины. С другой стороны, isValidNumber выполняет полную проверку, используя префикс и информацию о длине :

@Test
public void givenPhoneNumber_whenValid_thenOK() throws Exception {

PhoneNumber phone = phoneNumberUtil.parse("+911234567890",
CountryCodeSource.UNSPECIFIED.name());

assertTrue(phoneNumberUtil.isValidNumber(phone));
assertTrue(phoneNumberUtil.isValidNumberForRegion(phone, "IN"));
assertFalse(phoneNumberUtil.isValidNumberForRegion(phone, "US"));
assertTrue(phoneNumberUtil.isValidNumber(phoneNumberUtil.getExampleNumber("IN")));
}

Здесь число проверяется, когда мы не указали регион, а также когда мы это сделали.

3.5. isNumberGeographical

Этот метод проверяет, связана ли с данным номером география или регион:

@Test
public void givenPhoneNumber_whenNumberGeographical_thenValid() throws NumberParseException {

PhoneNumber phone = phoneNumberUtil.parse("+911234567890", "IN");
assertTrue(phoneNumberUtil.isNumberGeographical(phone));

phone = new PhoneNumber().setCountryCode(1).setNationalNumber(2530000L);
assertFalse(phoneNumberUtil.isNumberGeographical(phone));

phone = new PhoneNumber().setCountryCode(800).setNationalNumber(12345678L);
assertFalse(phoneNumberUtil.isNumberGeographical(phone));
}

Здесь в первом assert выше мы дали номер телефона в международном формате с кодом региона, и метод вернул true. Во втором утверждении используется местный номер из США, а в третьем — бесплатный номер. Таким образом, API вернул ложь для этих двух.

4. Вывод

В этом руководстве мы увидели некоторые функции, предлагаемые libphonenumber для форматирования и проверки телефонных номеров с использованием примеров кода.

Это богатая библиотека, которая предлагает гораздо больше служебных функций и заботится о большинстве потребностей нашего приложения в форматировании, анализе и проверке телефонных номеров.

Как всегда, исходный код доступен на GitHub .