使用libphonenumber驗證電話號碼

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

使用P honeNumberUtil#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.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,該API返回了false。

4. 結論

在本教程中,我們看到了libphonenumber提供的一些功能,這些功能可以使用代碼示例來格式化和驗證電話號碼。

這是一個功能豐富的庫,它提供了更多的實用程序功能,並滿足了我們大多數格式,解析和驗證電話號碼的應用程序需求。