電話番号をうまく扱うライブラリ(libphonenumber)の活用方法を考えてみる

1. 背景

社内で共有された以下の資料で、Googleが作成しているlibphonenumberという電話番号のバリデーションができるライブラリが紹介されていました。
自分が担当しているサービスは電話番号の入力が必須であり何かしら使えそうだということで活用方法を考えてみました。

2. libphonenumberの機能

僕はRubyを使用しているのでmobi/telephone_numberでできることをまとめます。

無効な電話番号を判定する

tel = TelephoneNumber.parse("00000000000", :JP)
tel.valid?
#=> false

電話番号から市区町村を特定する

以下のようにすることで電話番号から市区町村を求めることができます。 フリーダイヤルや携帯電話など市区町村が特定できない場合はnilが返却されます。

tel = TelephoneNumber.parse("0864xx29xx", :JP)
tel.location
#=> "Kurashiki, Okayama"

電話番号の種別を判別する

下記コードのように、TelephoneNumber#valid_typesメソッドを使って電話番号の種別を判別できます。

tel = TelephoneNumber.parse("08051xx93xx", :JP)
tel.valid_types
#=> [:mobile]

判別可能な番号種別

valid_types 種別
:area_code_optional ※日本では使われていないよう
:fixed_line 固定電話
:mobile 携帯電話(070, 080, 090)
:no_international_dialling 国際電話をかけることができないフリーダイヤル(0037, 0066, 0077, 0088など00から始まるフリーダイヤル)
:pager ポケベルやM2M等専用番号(020)
:personal_number 個人向け携帯電話番号(060)
:premium_rate ダイヤルQ2(0990から始まる電話番号※現在は使われていない)
:shared_cost ※日本では使われていないよう
:toll_free フリーダイヤル(0120, 0800, 0070, 0077, 0088, 0037など)
:uan ナビダイヤル(0570)
:voicemail ※日本では使われていないよう
:voip IP電話(050)

固定電話・携帯電話・個人向け携帯電話以外に対してはSMSを送信できないため、 SMSを送信するようなサービスの場合、上記 判別可能な番号種別 をもとに送信対象を絞ることでSMS利用料の削減が期待できそうです。