使用libphonenumber验证电话号码

2025/03/24

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"));
}

在这里,我们还使用了该函数的另一种变体,即将我们期望拨打号码的区域作为String传递。

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位数字,后面跟着3个或更多字母。上面的实用方法首先删除给定输入中的任何格式,然后检查此条件。

3.4 isValidNumber

我们讨论过的上一个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));
}

这里,在上面的第一个断言中,我们给出了带有区域代码的国际格式的电话号码,该方法返回了true。第二个断言使用了美国的本地号码,第三个断言使用了免费电话号码。因此,API对这两个断言都返回了false。

4. 总结

在本教程中,我们了解了libphonenumber提供的一些功能,可以使用代码示例来格式化和验证电话号码。

这是一个丰富的库,提供更多实用功能,并能满足我们大多数应用程序对格式化、解析和验证电话号码的需求。

Show Disqus Comments

Post Directory

扫码关注公众号:Taketoday
发送 290992
即可立即永久解锁本站全部文章