今回は、プログラムで「郵便番号」を使用するときに指定するデータ型についての注意点と発生した問題例を紹介していきます。
検証環境
検証に使用した環境/ライブラリを次に記載します。
- Java
- バージョン:11
注意点
「郵便番号」には、先頭に「0」が含まれる情報が存在します。たとえば、「北海道札幌市北区」の「郵便番号」は「0010000」になります。
先頭に「0」が含まれている「郵便番号」を「文字列型」ではなく「数値型」として使用する場合は、問題が発生することがあります。
実際に問題が発生するプログラム例は、次のようになります。
public class Main {
public static void main(String[] args) {
Integer zipcode = Integer.parseInt("0010000");
System.out.print(zipcode); // 10000
}
}
プログラムを実行した出力結果は、「10000」になります。
文字列の先頭に「0」が含まれている情報は、数値型へ変換すると「0」が削除された情報になります。このように「郵便番号」を「数値型」で使用する場合は、正しい「郵便番号」ではなくなる可能性があります。
問題例
問題が発生した例は、「郵便番号」を意図的に「数値型」に変換しているのではなく、オブジェクトへのマッピングを自動的にしてくれるライブラリを使用しているときに問題の混入する可能性があります。
データベースマッピング
データベースから取得した情報をオブジェクトへ変換するために「O/Rマッパー」などを使用するときに問題が発生する可能性があります。
- データベース:「郵便番号」を「文字列型」で指定します。
- オブジェクト:「郵便番号」を「数値型」で指定します。
このときに「郵便番号」の情報をデータベースからオブジェクトへの変換処理が行われると「文字列型」から「数値型」へ変換するため情報の消える可能性があります。
たとえば、データベースの「郵便番号」を「文字列型」の「0010000」として保持しています。データベースからオブジェクトへの変換処理が行われると、オブジェクト側の「郵便番号」は「10000」になる可能性があります。
オブジェクトマッピング
HTTPリクエストから取得した情報をオブジェクト変換するためのライブラリなどを使用するときに問題が発生する可能性があります。
- HTTPリクエスト:「郵便番号」を「文字列型」で指定します。
- オブジェクト:「郵便番号」を「数値型」で指定します。
このときに「郵便番号」の情報をHTTPリクエスト情報からオブジェクトへの変換処理が行われると「文字列型」から「数値型」へ変換するため情報の消える可能性があります。
たとえば、HTTPリクエスト情報の「郵便番号」を「0010000」の情報としてサーバ側が受け取ります。サーバ側でHTTPリクエスト情報をオブジェクトへの変換処理が行われると、オブジェクト側の「郵便番号」は「10000」になる可能性があります。
まとめ
「郵便番号」を使用するプログラムを作成する場合は、基本的に「文字列型」で管理するほうが安全になり問題が発生する可能性が下げることができます。