文字列を数値(int)に変換しようと思ったのですが、Integer クラスにはそれらしきメソッドが4つもあります。
decode と parseInt と getInteger と valueOf 、全部 static メソッドだし。
何でこんなにたくさんあるの?って感じですが、恐らく意味があるんでしょう。というわけで調査。
Android Developers の Integer クラスの説明にはどれも似たような説明が書いてあります。
(しかし getInteger は、「Returns the Integer value of the system property identified by string.」 とあるので、なんか違うっぽいです。)
また、valueOf には、parseInt へのリンク(See Also)があるので、両者はたぶん同じものと思われます。
サンプル書いて動かしてみました。
int num = 0;
num = Integer.decode("100"); // ⇒ 100
num = Integer.decode("#100");
// ⇒ 16進数として評価されるので「256」
num = Integer.decode("0100");
// ⇒ 8進数として評価されるので「64」
num = Integer.parseInt("100"); // ⇒ 100
num = Integer.parseInt("100", 10);
// ⇒ 10進数として評価されるので「100」
num = Integer.parseInt("100", 16);
// ⇒ 16進数として評価されるので「256」
num = Integer.parseInt("100", 8);
// ⇒ 8進数として評価されるので「64」
num = Integer.parseInt("#100"); // ⇒ 例外
num = Integer.parseInt("0100");
// ⇒ 10進数と評価されるので「100」
num = Integer.parseInt("FF", 16);
// ⇒ 16進数として評価されるので「255」
num = Integer.parseInt("FF"); // ⇒ 例外
num = Integer.valueOf("100", 10);
// ⇒ 10進数として評価されるので「100」
num = Integer.valueOf("100", 8);
// ⇒ 8進数として評価されるので「64」
num = Integer.valueOf("#100"); // ⇒ 例外
num = Integer.valueOf("0100");
// ⇒ 10進数と評価されるので「100」
num = Integer.valueOf("FF", 16);
// ⇒ 16進数として評価されるので「255」
num = Integer.valueOf("FF"); // ⇒ 例外
num = Integer.getInteger("100"); // ⇒ 例外。
まとめると、
decode は、文字列に 0x や # 、 0 をつけることで、16進数や8進数と解釈して変換してくれる。
parseInt(と valueOf) は、文字列だけ渡す場合は10進数として解釈される。# や 0x は使えない。16進、8進として認識したい場合は radix 引数を使う。
ということのようです。
ハマりポイントとしては、"0100" という文字列を渡す時、decode("0100") では8進数と解釈して「64」を返すのに対し、parseInt("0100") では、10進数として解釈され「100」が返されるところです。
渡すデータが 0 で埋められている場合(どんな場合だ?)には要注意ですね。
とりあえず parseInt を使っとけば安心、おっとクラスによってメソッド名が変わっちゃうのが気に入らないから valueOf 使っとけばいいか。
decode の方が仕事が多そうなので遅そうですしね。