今日もプログラミング

IT技術とかプログラミングのこととか特にJavaを中心に書いていきます

Integer.parseIntは奥が深い

Javaで文字列を整数に変換するには、Integer.parseIntを使う。

だが、こいつは半角数字だけでなく全角数字も通すので、

 

Integer.parseInt("1234")

なんてのも正常になる。 まあ親切なんだけど、業務システムだと「半角数字のみOK」な仕様なことが多いので、正規表現とかのチェックも別途必要になる。

 

と書いていたら、そもそもInteger.parseIntではどうやって文字を数字に変換するんだろ?と気になったので、ソースを追ってみる。

 

符号のチェック箇所を見ると、

    if (firstChar == '-') {
        negative = true;
        limit = Integer.MIN_VALUE;
    } else if (firstChar != '+')
        ...

のようになっている。「+」と「-」は半角のみ可のようだ。

 

文字を数値に変換するのは、Character.digitを使っている。そこで、以下のようなコードを書いて実行してみた。

for (int c = 0x000000; c < 0x10FFFF; c++) {
    int d = Character.digit(c, 10);
    if (d >= 0 && d <= 9) {
        System.out.println(String.format("%s (%06X) -> %d",(char)c,  c, d));
    }
}

...思った以上にたくさん出てきた。どこかの国の数字なんだろうな。例えば

System.out.println(Integer.parseInt("൧൨൩൪"));

を実行すると、

1234

 

と表示される。全角数字が通るシステムは、「൧൨൩൪」が通る確率も高そうだな。今度なんかのテスターになった時に試してみるか。

 

次はDouble.parseDoubleやnew BigDecimalについても書いてみる予定。

 

JDK : 8u31