1. 概要

このクイックチュートリアルでは、 Googleのオープンソースライブラリlibphonenumberを使用して、Javaの電話番号を検証する方法を説明します。

2. Mavenの依存関係

まず、このライブラリの依存関係をpom.xmlに追加する必要があります。

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

最新のバージョン情報は、 MavenCentralにあります。

これで、このライブラリが提供するすべての機能を使用できるようになりました。

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桁が含まれ、その後に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を返しました。 2番目のアサートは米国の市内番号を使用し、3番目のアサートはフリーダイヤル番号を使用します。 したがって、APIはこれら2つに対してfalseを返しました。

4. 結論

このチュートリアルでは、コードサンプルを使用して電話番号をフォーマットおよび検証するためにlibphonenumberによって提供される機能の一部を確認しました。

これは、より多くのユーティリティ関数を提供し、電話番号のフォーマット、解析、および検証に関するアプリケーションのニーズのほとんどを処理する豊富なライブラリです。

いつものように、ソースコードはGitHubから入手できます。