プログラムでよく出てくる、数値と文字列の相互変換の基本的な方法についてまとめておく。
Javaでは String (Java.lang.String クラス) のオブジェクトが文字列を表す。
String オブジェクトは + 演算子で連結できる。片方のみが String であれば、もう片方は文字列表現にして連結される。
※ 実際の文字列の連結は、後述する StringBuilder (J2SE 1.4 以前は StringBuffer) を使ったコードを自動生成することによって実現されている。
(例) i が int 型の変数のとき、下のように空文字列 "" と連結することで
"" + i
i の文字列表現が得られる。
byte, short, long, float, double 等のプリミティブも同様に文字列化できる。
プリミティブ型 byte, short, int, long, float, double に対応して、ラッパークラス java.lang.Byte, java.lang.Short, java.lang.Integer, java.lang.Long, java.lang.Float, java.lang.Double (単に Byte, Short, Integer, Long, Float, Double と書いてよい) が用意されている。
(例) b が byte 型、s が short 型、i が int 型、l が long 型、f が float 型、d が double 型の変数のとき
new Byte( b ).toString()
new Short( s ).toString()
new Integer( i ).toString()
new Long( l ).toString()
new Float( f ).toString()
new Double( d ).toString()
あるいは staticメソッドを使って
Byte.toString( b )
Short.toString( s )
Integer.toString( i )
Long.toString( l )
Float.toString( f )
Double.toString( d )
で b, s, i, l, f, d の文字列表現が得られる。
なお、Integer, Long では、
Integer.toString(int i, int radix)
Long.toString(long l, int radix)
という指定した進数の文字列を求めるstaticメソッドもある。
パラメータ radix の指定は、Character.MIN_RADIX (=2) 進数 から Character.MAX_RADIX (=36) 進数の範囲にないといけない。
また、2進, 8進, 16進の文字列表現を得るためのstaticメソッド、それぞれ、
2進 Integer.toBinaryString(int i)
8進 Integer.toOctalString(int i)
16進 Integer.toHexString(int i)
2進 Long.toBinaryString(long i)
8進 Long.toOctalString(long i)
16進 Long.toHexString(long i)
も用意されている。
(例) i が int 型、l が long 型、f が float 型、d が double 型の変数のとき
String.valueOf( i )
String.valueOf( l )
String.valueOf( f )
String.valueOf( d )
で i, l, f, d の文字列表現が得られる。
一般には、単純な一個だけの変換でなく、いくつもの項目を連結した複雑な文字列を作りたいときに使用する。
StringBuilder には、種々のパラメータを文字列表現として末尾に追加する append メソッド群があり、最も頻繁に使われる。他に、位置を指定して追加する insert メソッド群もある。
(例) i が int 型、d が double 型の変数のとき
StringBuilder buf = new StringBuilder();
として
buf.append( i );
や
buf.append( d );
のように、StringBuilder に i や d の文字列表現を加えていく。同様に、byte, short, long や float も文字列として連結できる。
StringBuilderには、char も String も append できる。それらのappendを組み合わせて、目的とする文字列を作り上げる。
最終的にできた StringBuilder オブジェクトから
String s = buf.toString();
のように String を求められる。
※ StringBuffer
J2SE 1.4 以前のJavaでは、StringBuilder は無く、同様の機能を持つが複数スレッドで同期の取れている StringBuffer (java.lang.StringBufferクラス) を使う。
それ以降のJavaでは、ほとんどの場合、加工中の文字列に対する同期の必要がないので、効率が少し良くなることが期待できる StringBuilder を使う方がよい。
Byte.parseByte( String s ) | 文字列 s を byte 値に変換した値を返す |
Short.parseShort( String s ) | 文字列 s を short 値に変換した値を返す |
Integer.parseInt( String s ) | 文字列 s を int 値に変換した値を返す |
Long.parseLong( String s ) | 文字列 s を long 値に変換した値を返す |
Float.parseFloat( String s ) | 文字列 s を float 値に変換した値を返す |
Double.parseDouble( String s ) | 文字列 s を double 値に変換した値を返す |
※ parseFloat, parseDouble は Java2 1.2 で導入されたので 1.1 以前では使えない。
文字列が指定した型の数値に変換できない場合は NumberFormatException (クラス java.lang.NumberFormatException) という例外が発生する。
この例外が発生したとき何も対処していないとプログラムが停止してしまうのでまずい。
そのため、通常 try ~ catch で囲んで下のような形で使用することが多い。
String s = ... int i = 0; try { i = Integer.parseInt( s ); } catch ( NumberFormatException nfe ) { // ここに変換できない場合の処理を書く }
なお、整数型の場合は
Byte.parseByte( String s, int radix ) | 文字列 s を radix 進数として見て byte 値に変換した値を返す |
Short.parseShort( String s, int radix ) | 文字列 s を radix 進数として見て short 値に変換した値を返す |
Integer.parseInt( String s, int radix ) | 文字列 s を radix 進数として見て int 値に変換した値を返す |
Long.parseLong( String s, int radix ) | 文字列 s を radix 進数として見て long 値に変換した値を返す |
という10進数以外に対応したものもある。
パラメータ radix の指定は、Character.MIN_RADIX (=2) 進数 から Character.MAX_RADIX (=36) 進数の範囲にないといけない。
(例) s を String として
new Integer( s ).intValue()
で int に変換された値が、
Double.valueOf( s ).doubleValue()
で double に変換された値が、それぞれ得られる。
この方法でも、指定した型の数値に変換できない場合は NumberFormatException の例外が発生するので、try ~ catch で囲む方がよい。