数値と文字列の相互変換のまとめ

プログラムでよく出てくる、数値と文字列の相互変換の基本的な方法についてまとめておく。


数値 → 文字列 変換

方法(1) : 文字列と + 演算子で連結する。

Javaでは String (Java.lang.String クラス) のオブジェクトが文字列を表す。
String オブジェクトは + 演算子で連結できる。片方のみが String であれば、もう片方は文字列表現にして連結される。
※ 実際の文字列の連結は、後述する StringBuilder (J2SE 1.4 以前は StringBuffer) を使ったコードを自動生成することによって実現されている。

(例) i が int 型の変数のとき、下のように空文字列 "" と連結することで

"" + i

   i の文字列表現が得られる。
byte, short, long, float, double 等のプリミティブも同様に文字列化できる。

方法(2) : 数値のラッパークラス(Byte, Short, Integer, Long, Float, Double)の toString() を使う。

プリミティブ型 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)

も用意されている。

方法(3) : String のstaticメソッド valueOf() を使う。

(例) i が int 型、l が long 型、f が float 型、d が double 型の変数のとき

String.valueOf( i )
String.valueOf( l )
String.valueOf( f )
String.valueOf( d )

   で i, l, f, d の文字列表現が得られる。

方法(4) : StringBuilder (java.lang.StringBuilderクラス) を使い、append() や insert() などを使って連結していく。

一般には、単純な一個だけの変換でなく、いくつもの項目を連結した複雑な文字列を作りたいときに使用する。

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 を使う方がよい。


文字列 → 数値 変換

方法(1) : 数値のラッパークラス(Byte, Short, Integer, Long, Float, Double)のstaticメソッド parse...() を使う。

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) 進数の範囲にないといけない。

方法(2) : 数値のラッパークラス(Byte, Short, Integer, Long, Float, Double)の コンストラクタ (または valueOf() ) と ...Value() を使う。

(例) s を String として

new Integer( s ).intValue()

   で int に変換された値が、

Double.valueOf( s ).doubleValue()

   で double に変換された値が、それぞれ得られる。

この方法でも、指定した型の数値に変換できない場合は NumberFormatException の例外が発生するので、try ~ catch で囲む方がよい。