使用libphonenumber驗證電話號碼 - Baeldung

banq發表於2020-10-11

在本快速教程中,我們將看到如何使用Google的開源庫libphonenumber來驗證Java中的電話號碼。
首先,我們需要在pom.xml中新增此庫的依賴項:

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

最新版本資訊可以在Maven Central上找到。

現在,我們可以使用該庫提供的所有功能。
讓我們看一些如何使用其各種API進行驗證的示例。
重要的是,在所有示例中,我們將使用此類的單例物件進行方法呼叫:

PhoneNumberUtil phoneNumberUtil = PhoneNumberUtil.getInstance();


該庫提供了一個實用程式類PhoneNumberUtil,它提供了幾種j檢查電話號碼的方法。使用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"));

 

該庫可識別不同型別的電話號碼,例如固定電話,行動電話,免費電話,語音郵件,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位行動電話號碼。
 
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"));
}

有效的字母數字開頭至少應包含三個數字,然後是三個或更多字母。上面的實用程式方法首先剝離給定輸入的所有格式,然後檢查這種情況。
 
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")));
}

無論是否指定國家區域,該號碼都會被驗證。 
 
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。
原始碼可以在GitHub上獲得
 

相關文章