前々回、commons-beanutils を使って文字列をオブジェクトへ変換する方法を見ました。
今回は、Java の標準 API にデフォルトで組み込まれていて、数値に対してこれと同様のことをするクラス NumberFormat を見ていきましょう*1。 これらは java.text パッケージに含まれています。
commons-beanutils との違いは?
commons-beanutils に対する長所と短所を見てみましょう。
長所
- Java の標準 API にデフォルトで組み込まれている。
- 末尾に "L", "l" がついていても long リテラルを表す文字列と認識される。
- インスタンスを生成することで、いろいろな設定・解析方法を同時に使える。
もう少し詳しく見てみると、(1) → 別途ライブラリをインストールする必要がない (2) → commons-beanutils ではサポートされてなかった*2 (3) → 省略。
短所
- 使い方がチョットだけ複雑。
- 数値の中でも、Long 型と Double 型しかサポートしていない。
こちらももう少し詳しく見てみると、(1) → commons-beanutils のように static メソッドを呼び出すだけでは使えない。 とは言っても1行で書ける程度。 (2) → Long 型として解析できるなら Long 型、そうでなければ Double 型として解析する。 特に、Integer 型の値として取得するためには少し処理が必要。
どうやって使うのか?
一般的には、次の手順で使用します:
- NumberFormat オブジェクトを取得する。
- インスタンス・メソッドを呼び出して、変換を実行する。
サンプル・コードは以下のような感じ:
/* メソッド内 */ // 1. NumberFormat オブジェクトを取得する final NumberFormat formatter = NumberFormat.getInstance(); // 2. 変換を実行 // このサンプルでは Long 型の 100 が返される final Number n = formatter.parse("100");
いろいろ変換してみると・・・
前々回の ConvertUtils の時のように、Java リテラルについて変換をいろいろ試してみましょう。 変換後(矢印の右側)は返り値の Number オブジェクトに対して toString() メソッドを呼び出した結果です。
int リテラル
- 0 → 0
- 2 → 2
- 0372 → 372
- 0xDadaCafe → 0
- 1996 → 1996
- 0x00FF00FF → 0
ConvertUtils.convert() のように、Java の8進数リテラル("0"で始まる)、16進数リテラル("0x"で始まる)は認識されないようです。 解析に失敗すると0が返されます。
long リテラル
- 1 → 1
- 00l → 0
- 0777 → 777
- 0777L → 777
- 0x100000L → 0
- 0xC0B0L → 0
ConvertUtils.convert() と違って、末尾に "L", "l" が付いていてもキチンと認識されます。 それ以外は int リテラルと同じ。
float リテラル
- 1e1f → 1
- 2.f → 2
- .3f → 0.3
- 0f → 0
- 3.14F → 3.14
末尾に "F", "f" が付いていてもキチンと認識されますが、残念ながら指数部が付いていても "E", "e" 以降は無視されるようです。
double リテラル
- 1e1 → 1
- 2. → 2
- .3 → 0.3
- 0.0 → 0
- 3.14 → 3.14
- 1e-9d → 1
- 1e137 → 1
float リテラルと同様、指数部が付いていても "E", "e" 以降は無視されます。 末尾の "D", "d" はキチンと認識されます。