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