倭マン's BLOG

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

ConvertUtils 基礎の基礎

前回は commons-beanutils の基本的な使い方を見ました。 今回は、前回の最後の方に出てきたユーティリティ・クラス ConvertUtils のメソッド Object convert(String, Class<?>) の振る舞いを見ていきます*1

このメソッドの使用目的は第1引数の文字列を第2引数のクラスで指定される型へ変換(convert)することです。 例えば、

ConvertUtils.convert("true", Boolean.class);

とすると、Boolean 型のオブジェクト Boolean.TRUE が返されます。

デフォルトで第2引数に指定できるクラス

でした*2。 以下で幾つかを見ていきましょう。 ただし、

  • java.lang.String はそのままなので省略。
  • byte, short, char とそのラッパ型は省略*3
  • java.lang.Class は Class.forName(String) と(たぶん)同じなので省略。
  • java.io.File, java.net.URL, java.math.BigInteger, java.math.BinDecimal は普通に使う分には、直感的な使い方そのままなので省略。

boolean ★ java.lang.Boolean


これは boolean リテラルをそのまま文字列にしたものです。

  • "true" → Boolean.TRUE
  • "false" → Boolean.FALSE

ただし、大文字、小文字が混ざっていてもいいようです。 例えば、"TRUE", "truE" などもきちんと変換されます。 また、文字列を解析できなければ、Boolean.FALSE が返されます*4

int ★ java.lang.Integer


Java の言語仕様に載ってた int リテラルを試してみるとこんな感じでした(右側の数字は、返り値のオブジェクトに対して toString() メソッドを呼び出した結果です):

  • 0 → 0
  • 2 → 2
  • 0372 → 372
  • 0xDadaCafe → 0
  • 1996 → 1996
  • 0x00FF00FF → 0

最初の "0" は無視されるようです(Java では8進数とみなされる)。 また、"0x" から始まると(Java では16進数とみなされる)文字列の解析に失敗したと見なされます。 文字列の解析に失敗した場合、0 が返されます。

long ★ java.lang.Long


int リテラルの場合と同様に、long リテラルの場合は

  • 1 → 1
  • 00l → 0
  • 0777 → 777
  • 0777L → 0
  • 0x100000000L → 0
  • 0xC0B0L → 0

Java の long リテラルと違って、最後に "L", "l" がついていると、文字列の解析に失敗したと見なされます。 その他は int の場合と同じです。

float ★ java.lang.Float


float リテラルの場合。

  • 1e1f → 10.0
  • 2.f → 2.0
  • .3f → 0.3
  • 0f → 0.0
  • 3.14F → 3.14
  • 6.022137e+23f → 6.022137E23

long リテラルの場合と違って、末尾の "F", "f" は認識されます。 また、指数部を付加したフォーマットも認識されます。

double ★ java.lang.Double


double リテラルの場合。 だいたい float リテラルの場合と同様です。 末尾に "D", "d" をつけていてもきちんと認識されます。

  • 1e1 → 10.0
  • 2. → 2.0
  • .3 → 0.3
  • 0 → 0.0
  • 3.14 → 3.14
  • 1e-9d → 1.0E-9
  • 1e137 → 1.0E137

java.sql.Data ★ java.sql.Time ★ java.sql.Timestamp


ここでは無愛想なフォーマットとサンプルだけを載せておきます:

Java クラス フォーマット サンプル文字列
java.sql.Data yyyy-mm-dd "1970-01-01"
java.sql.Time hh:mm:ss "12:34:56"
java.sql.Timestamp yyyy-mm-dd hh:mm:ss.nnn "1970-01-02 19:17:36.789"

*1:このユーティリティ・クラスを直接使うのはあまりよろしくないようですが。

*2:プリミティブ型を指定するためには、TYPE フィールドを指定します。 例えば Boolean.TYPE などです。 返り値のオブジェクトはラッパクラスのインスタンスになります。

*3:char 型に関しては "\\u03a9" のような Unicode エスケープは認識されないようです。

*4:簡単に言えば、全文字を小文字にして "true" に一致すれば Boolean.TRUE を、そうでなければ Boolean.FALSE を返します。