倭マン's BLOG

くだらない日々の日記書いてます。 たまにプログラミング関連の記事書いてます。 書いてます。

java.text パッケージ 基礎の基礎

前々回、commons-beanutils を使って文字列をオブジェクトへ変換する方法を見ました。

今回は、Java の標準 API にデフォルトで組み込まれていて、数値に対してこれと同様のことをするクラス NumberFormat を見ていきましょう*1。 これらは java.text パッケージに含まれています。

commons-beanutils との違いは?


commons-beanutils に対する長所と短所を見てみましょう。

長所

  1. Java の標準 API にデフォルトで組み込まれている。
  2. 末尾に "L", "l" がついていても long リテラルを表す文字列と認識される。
  3. インスタンスを生成することで、いろいろな設定・解析方法を同時に使える。

もう少し詳しく見てみると、(1) → 別途ライブラリをインストールする必要がない (2) → commons-beanutils ではサポートされてなかった*2 (3) → 省略。

短所

  1. 使い方がチョットだけ複雑。
  2. 数値の中でも、Long 型と Double 型しかサポートしていない。

こちらももう少し詳しく見てみると、(1) → commons-beanutils のように static メソッドを呼び出すだけでは使えない。 とは言っても1行で書ける程度。 (2) → Long 型として解析できるなら Long 型、そうでなければ Double 型として解析する。 特に、Integer 型の値として取得するためには少し処理が必要。

どうやって使うのか?


一般的には、次の手順で使用します:

  1. NumberFormat オブジェクトを取得する。
  2. インスタンス・メソッドを呼び出して、変換を実行する。

サンプル・コードは以下のような感じ:

/* メソッド内 */

// 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" はキチンと認識されます。

*1:同パッケージ内にある DecimalFormat も使い方は同じです。 つーか、デフォルトでは変換結果も同じ。

*2:バージョンは 1.7.0