📙

Rubyで住所の全角/半角変換、電話番号の-(ハイフン)繋ぎ

2022/11/29に公開

こんにちは!
スペースマーケットでバックエンドエンジニアをしている水沼です。

今回はある機能の導入にあたり、ユーザーに入力頂いた電話番号、住所情報を指定のフォーマットに変換する必要があり、求められた形式に変換するためにはどうしたらよいかと複数サイトを調べ回った記憶があるので、そのいくつかをわかりやすい形でまとめてみます!

半角英数字記号を全角に変換する

今回は住所情報中の英数字記号を全角に変換します。
住所情報について登録されたものをみてみると、大抵の場合、英数字記号については半角になっていることが多いかと思います。

address = "東京都渋谷区神宮前6-25-14 JRE神宮前メディアスクエアビル2F" # 半角

この住所情報に含まれる英数字記号を全て全角にするために以下の処理を行いました。

# 半角英数字を全角英数字にする
address.tr("A-Za-z0-9", "A-Za-z0-9")
# 半角記号を全角記号にする
address.tr("\s!#$%&\'\"()*+,-./:;<=>?@[]^_`{|}~\\", " !#$%&'"()*+,-./:;<=>?@[]^_`{|}~\")

実行結果は以下です。

- address = "東京都渋谷区神宮前6-25-14 JRE神宮前メディアスクエアビル2F" # 半角
+ address = "東京都渋谷区神宮前6-25-14 JRE神宮前メディアスクエアビル2F" # 全角

一見すると変わらないように見えますが、英数字記号文字が全角になりました。

String#trメソッドを利用しています。第1引数の文字の羅列に一致するものがあれば第2引数の一致するインデックスの文字に置換するというメソッドを生かしたシンプルな仕組みです。

全角カナ文字を半角に変換する

続いて、登録された住所カナ情報を見てみますと、大抵の場合、下記のようにカナ文字については全角で入力されていると思います。

address_kana = "トウキョウトシブヤクジングウマエ 6-25-14 JREジングウマエメディアスクエアビル2F"

この住所カナ情報を全て半角カナ文字にするために、以下の処理を行いました。

# 全角文字を半角文字に変換する
NKF.nkf("-w -Z4", address_kana)

実行結果は以下です。

- address_kana = "トウキョウトシブヤクジングウマエ 6-25-14 JREジングウマエメディアスクエアビル2F" # 全角
+ address_kana = "トウキョウトシブヤクジングウマエ6-25-14JREジングウマエメディアスクエアビル2F" # 半角

Rubyの標準モジュールのNKF(Network Kanji code conversion Filter)を利用しています。

第1引数に変換オプション、第2引数に変換したい文字列を指定します。
-wで出力文字コードをUTF-8に設定し、-Z4で全角カタカナ→半角カタカナ変換を設定します。

他にもひらがな⇆カタカナ変換ができたりと、日本語に関する変換機能をNKFで実装できそうです。

電話番号をハイフン繋ぎにする

最後になります。
スペースマーケットではユーザーの電話番号情報を下記のように-(ハイフン)なしで管理しています。

tel = "07082885919" # 電話番号はデモデータ

この電話番号の適切な位置に-(ハイフン)を入れるためにはどうしたら良いか。
結論から言うと、以下のように処理しました。

# 電話番号をハイフン繋ぎにする
TelephoneNumber.parse(tel, :jp).national_number

実行結果は以下です。

- tel = "07082885919" # ハイフンなし
+ tel = "070-8288-5919" # ハイフンあり

Googleの電話番号処理ライブラリlibphonenumberのラッパーライブラリであるtelephonenumberを利用しています。

電話番号の-(ハイフン)区切りは一定のルールが存在するらしいものの、それら全てのパターンを考慮して適切に区切っていくロジックを実装するのは現実的に思えず、悩んでいたところでこのGemに辿り着きました。

試しにかなり珍しいとされる5桁の市外局番を持つ電話番号を変換してみても、正しく区切らていたので大抵の電話番号はこのGemでカバーできそうです。

他にも国際電話番号形式(例)+817082885919にしたり、有効な電話番号であるかを確認することもできます!

電話番号は真面目に扱おうとすると結構大変な印象ですので、電話番号の処理に悩むことがあればlibphonenumberの導入を検討してみてはいかがでしょう。

最後に

スペースマーケットでは、一緒にサービスを成長させていく仲間を探しています。

レンタルスペース業界をエンジニアリングの側面からより面白くしてみたいと少しでも思った方、とりあえずどんなことしているのか聞いてみたいという方も大歓迎です!
是非ご覧ください。
https://www.wantedly.com/projects/1113570
https://www.wantedly.com/projects/1113544
https://www.wantedly.com/projects/1061116
https://spacemarket.co.jp/recruit/engineer/

スペースマーケット Engineer Blog

Discussion