|
|
ラッパークラスを使った文字列と数値の変換 |
H.Kamifuji . |
int型などの基本データ型には、それぞれ対応するラッパークラスと呼ばれるクラスが用意されています。ここではラッパークラスの基本的な使い方として数値と文字列に変換したり、文字列を数値に変換する方法を確認します。 当ページでは、Linux CentOS7 の Gnome で動作テストしています。 現在(2021/08)では、JDK-16.0.2 にアップされています。一部、上位互換について、見直しを行っていきます。 現在(2021/11)では、JDK-17.0.1 にアップされています。一部、上位互換について、見直しを行っていきます。 現在(2023/04)では、JDK-20.0.1 にアップされています。一部、上位互換について、見直しを行っていきます。 現在(2024/10)では、JDK-23 にアップされています。一部、上位互換について、見直しを行っていきます。 |
|
Javaでは基本データ型が用意されており、数値や文字を格納したり演算子と組み合わせる場合であれば基本データ型を使えば十分です。ただ基本データ型にはクラスのようにメソッドは用意されていませんので、基本データ型に対して操作を行ったりすることはできません。 そこで基本データ型の値を持つことができ、様々な便利なメソッドを用意したクラスが用意されています。それがラッパークラスと呼ばれるものです。基本データ型から対応するラッパークラスのオブジェクトを作成し、そのオブジェクトに対して用意されたメソッドを利用することで例えば数値から文字列への変換といった処理が可能になります。 では基本データ型と、対応するラッパークラスの一覧をまず見てみます。 基本データ型 ラッパークラス ----------------------------- boolean Boolean char Character byte Byte short Short int Integer long Long float Float double Doubleint型のラッパークラスはIntegerクラス、float型のラッパークラスはFloatクラスです。基本的には基本データ型の先頭文字を大文字にしたものがラッパークラスの名前ですが、char型とint型だけは異なりますので注意して下さい。 なお各クラスは次のように定義されています。 java.lang.Boolean public final class Boolean extends Object implements Serializable, ComparableBooleanクラスとCharacterクラスを除いたクラスは全てNumberクラスと呼ばれるクラスの子クラスとなっています。Numberクラスの子クラスには他にBigDecimalクラスやBigIntegerクラスがあり、Numberクラスは数値を扱うための基本となっているクラスです。 各クラスには様々なメソッドが用意されていますが、次のページ以降ではラッパークラスの中でも数値を扱うByteクラス、Shortクラス、Integerクラス、Longクラス、Floatクラス、Doubleクラスの基本的な使い方と、プログラミングでよく利用される数値と文字列の変換について確認していきます。詳細なクラスの利用方法はクラスライブラリのところで改めて行います。 |
基本データ型の値に対して様々な操作を行うには、基本データ型の値を持つラッパークラスのオブジェクトを作成します。そして作成したオブジェクトに対してラッパークラスで用意された様々なメソッドを用いていきます。 例としてint型の値を持つIntegerクラスのオブジェクトを作成します。new演算子を使い次のように記述します。(new演算子の簡単な説明は「標準クラスの使い方」を参照して下さい。詳しくはまた改めて解説します)。 new Integer(int型の値)引数にはint型の値を指定します。例えば次のように記述します。 int i = 84; Integer oi = new Integer(i);他のラッパラークラスも同じように基本データ型を持つオブジェクトを作成することができます。 byte b = 12; Byte ob = new Byte(b); short s = 32; Short os = new Short(s); long l = 153L; Long ol = new Long(l); float f = 3.24F; Float of = new Float(f); double d = 7.6; Double od = new Double(d);オブジェクトを作成するには他にもvalueOfメソッドを使用する方法などがありますがここでは省略します。 オートボクシングJ2SE5.0以降ではオートボクシング(Autoboxing)と言う機能が提供されるようになりました。簡単に言えば本来ラッパークラスのオブジェクトを記述すべきところにラッパークラスに対応した基本データ型の値を記述すると、自動で変換してくれるというものです。言葉で書くと分かりにくいのですが、次のような記述を行うことができます。 int i = 84; Integer oi = i;これは次のように記述した場合と同じです。 int i = 84; Integer oi = new Integer(i);オブジェクトを作成せずに単に基本データ型の値を記述するだけでいいのでプログラムを簡潔に記述することができます。ただ自動的に変換されているということは覚えておいて下さい。 では簡単な例で試しておきます。 サンプルプログラム下記のサンプルを実行してみよう。class JSample2_1{ public static void main(String args[]){ int i = 84; Integer oi = new Integer(i); System.out.println(oi.intValue()); /* オートボクシングを利用 */ Long ol = 153L; System.out.println(ol.longValue()); } }JDK-23 では、下記の警告(削除マーク)が発生しました。 [xxxxxxxx@dddddddddd Wrapper_class]$ javac JSample2_1.java JSample2_1.java:4: 警告: [removal] IntegerのInteger(int)は推奨されておらず、 削除用にマークされています Integer oi = new Integer(i); ^ 警告1個 [xxxxxxxx@dddddddddd Wrapper_class]$上記をコンパイルした後で実行すると次のように表示されます。 [xxxxxxxx@dddddddddd Wrapper_class]$ java JSample2_1 84 153 [xxxxxxxx@dddddddddd Wrapper_class]$下記のように書き換えると良いようです。
class JSample2_2{
public static void main(String args[]){
int i = 84;
// Integer oi = new Integer(i);
Integer oi = Integer.valueOf(i);
System.out.println(oi.intValue());
/* オートボクシングを利用 */
Long ol = 153L;
System.out.println(ol.longValue());
}
}
上記をコンパイルした後で実行すると次のように表示されます。[xxxxxxxx@dddddddddd Wrapper_class]$ java JSample2_2 84 153 [xxxxxxxx@dddddddddd Wrapper_class]$このサンプルではラッパークラスの値を取得するためにintValueメソッドとlongValueメソッドを使っています。このメソッドの説明は次のページで行います。 |
ラッパークラスのオブジェクトを作成すると、そのオブジェクトには対応する基本データ型の値が保持されています。ここではオブジェクトが持っている値を取得する方法を確認します。 値を取得するには各クラスで定義されているメソッドを使います。例としてIntegerクラスのオブジェクトから値を取得するにはIntegerクラスで用意されているintValueメソッドを使います。 int i = 84; Integer oi = new Integer(i); int val = oi.intValue();intValueメソッドはオブジェクトが持つ値をint型の値として返します。またIntegerクラスには値をlong型の値として返すlongValueメソッドやdouble型の値として返すdoubleValueメソッドなども用意されています。 他のラッパラークラスも同じようにオブジェクトが保持している値を取得するメソッドが用意されています。 Byteクラス: byte byteValue() Shortクラス: short shortValue() Integerクラス: int intValue() Longクラス: long longValue() Floatクラス: float floatValue() Doubleクラス: double doubleValue()例としてShortクラスとDoubleクラスのオブジェクトからそれぞれshort型の値を取り出す場合とdouble型の値を取り出す方法を見てみます。 short s = 32; Short os = new Short(s); int sval = os.shortValue(); double d = 7.6; Double od = new Double(d); double oval = od.doubleValue(); オートボクシング値を取得する場合にもオートボクシングが利用可能です。例えば次のような記述が可能です。int i = 84; Integer oi = i; int val = oi;これは次のように記述した場合と同じです。 int i = 84; Integer oi = new Integer(i); int val = oi.intValue();オートボクシングを使用することでラッパークラスのオブジェクトをあたかも基本データ型のように扱うことができます。ただあくまでもオートボクシング機能によって自動的に変換されているということは覚えておいて下さい。 では簡単な例で試しておきます。 サンプルプログラム下記のサンプルを実行してみよう。class JSample3_1{ public static void main(String args[]){ int i = 84; Integer oi = new Integer(i); System.out.println(oi.intValue()); System.out.println(oi); } }JDK-23 では、下記の警告(削除マーク)が発生しました。 [xxxxxxxx@dddddddddd Wrapper_class]$ javac JSample3_1.java JSample3_1.java:4: 警告: [removal] IntegerのInteger(int)は推奨されておらず、 削除用にマークされています Integer oi = new Integer(i); ^ 警告1個 [xxxxxxxx@dddddddddd Wrapper_class]$上記をコンパイルした後で実行すると次のように表示されます。 [xxxxxxxx@dddddddddd Wrapper_class]$ java JSample3_1 84 84 [xxxxxxxx@dddddddddd Wrapper_class]$下記のように書き換えると良いようです。
class JSample3_2{
public static void main(String args[]){
int i = 84;
// Integer oi = new Integer(i);
Integer oi = Integer.valueOf(i);
System.out.println(oi.intValue());
System.out.println(oi);
}
}
上記をコンパイルした後で実行すると次のように表示されます。[xxxxxxxx@dddddddddd Wrapper_class]$ java JSample3_2 84 84 [xxxxxxxx@dddddddddd Wrapper_class]$ |
int型の値やfloat型の値を文字列(Stringクラスのオブジェクト)に変換する方法を確認します。単に出力したいというだけなら文字列に変換する必要はありませんが、文字列に変換することでStringクラスで用意されている各メソッドを使用することができるようになります。 変換する方法は3つあります。順に確認していきます。 toStringメソッドを使用する1つ目の方法は基本データ型をラッパークラスのオブジェクトに変換した後で、各ラッパークラスで用意されているtoStringメソッドを使って文字列に変換する方法です。toStringメソッドはオブジェクトの文字列表現を返します。int i = 84; Integer oi = new Integer(i); String str = oi.toString();上記ではIntegerクラスを使った場合ですが他のラッパークラスでも同様です。 valueOfメソッドを使用する2つ目の方法はStringクラスで用意されているvalueOfメソッドを使って文字列に変換する方法です。valueOfメソッドは対象となる値の種類毎に次のようなメソッドが用意されています。static String valueOf(boolean b) static String valueOf(char c) static String valueOf(double d) static String valueOf(float f) static String valueOf(int i) static String valueOf(long l)valueOfメソッドは引数に指定された値の文字列表現を返します。例えばint型の値を文字列に変換する場合は次のように記述します。 int i = 84; String str = String.valueOf(i);この場合、引数にはラッパークラスのオブジェクトではなく基本データ型の値を直接指定することに注意して下さい。 なおshort型とbyte型の引数を取るメソッドが用意さえていませんが、どちらのデータ型の値をvalueOfメソッドの引数に指定しても文字列表現を取得できます。恐らく自動的にint型へ変換されてメソッドが実行されていると考えられます。 +演算子を使用する「文字列の連結」で記述していますが「+」演算子は文字列と数値が対象だった場合には数値を文字列に変換してから連結を行います。その為、基本データ型の値と空文字""を「+」演算子で連結することで数値を文字列に変換することができます。例えば次のように記述します。 int i = 84; String str = "" + i;「+」演算子の対象の値の1つが文字列なので、もう一方の値である数値を文字列に変換してから連結します。連結する左側の文字列は空文字なので結果的に数値を文字列に変換したものが左辺に代入されることになります。 では簡単な例で試しておきます。 サンプルプログラム下記のサンプルを実行してみよう。class JSample4_1{ public static void main(String args[]){ int i = 84; Integer oi = new Integer(i); String str1 = oi.toString(); String str2 = String.valueOf(i); String str3 = "" + i; System.out.println(str1); System.out.println(str2); System.out.println(str3); } }JDK-23 では、下記の警告(削除マーク)が発生しました。 [xxxxxxxx@dddddddddd Wrapper_class]$ javac JSample4_1.java JSample4_1.java:4: 警告: [removal] IntegerのInteger(int)は推奨されておらず、 削除用にマークされています Integer oi = new Integer(i); ^ 警告1個 [xxxxxxxx@dddddddddd Wrapper_class]$上記をコンパイルした後で実行すると次のように表示されます。 [xxxxxxxx@dddddddddd Wrapper_class]$ java JSample4_1 84 84 84 [xxxxxxxx@dddddddddd Wrapper_class]$下記のように書き換えると良いようです。
class JSample4_2{
public static void main(String args[]){
int i = 84;
// Integer oi = new Integer(i);
Integer oi = Integer.valueOf(i);
String str1 = oi.toString();
String str2 = String.valueOf(i);
String str3 = "" + i;
System.out.println(str1);
System.out.println(str2);
System.out.println(str3);
}
}
上記をコンパイルした後で実行すると次のように表示されます。[xxxxxxxx@dddddddddd Wrapper_class]$ java JSample4_2 84 84 84 [xxxxxxxx@dddddddddd Wrapper_class]$ |
数値形式の文字列を数値そのものに変換する方法を確認します。変換する方法は3つあります。順に確認していきます。 parsexxxメソッドを使用する1つ目の方法は各ラッパークラスで用意されているparsexxxメソッドを使う方法です。xxxの部分はラッパークラス毎に異なりそれぞれ次のようなメソッドが用意されています。Byteクラス: static byte parseByte(String s) Shortクラス: static short parseShort(String s) Integerクラス: static int parseInt(String s) Longクラス: static long parseLong(String s) Floatクラス: static float parseFloat(String s) Doubleクラス: static double parseDouble(String s)例えばIntegerクラスで用意されているparseIntメソッドは、引数に指定された文字列を整数の値として解析しint型の値として返します。実際には次のように記述します。 String str = "124"; int i = Integer.parseInt(str);なお整数でない数値の文字列をparseIntメソッドを使って変換しようとしたり、そもそも数値形式でない文字列を変換しようとすると、コンパイルエラーとはなりませんが実行時に「java.lang.NumberFormatException: For input string」というエラーが発生します。例えば次のような場合です。 String str = "124.567"; int i = Integer.parseInt(str);また範囲を超えた数値の文字列を変換しようとすると、コンパイルエラーとはなりませんが実行時に「java.lang.NumberFormatException: Value out of range」というエラーが発生します。例えば次のような場合です。 String str = "198667234"; byte b = Byte.parseByte(str);いずれの場合もコンパイル時にはエラーとなりませんので注意して下さい。 valueOfメソッドを使用する2つ目の方法は各ラッパークラスで用意されているvalueOfメソッドを使用する方法です。各クラス毎に戻り値が異なる次のようなメソッドが用意されています。Byteクラス: static Byte valueOf(String s) Shortクラス: static Short valueOf(String s) Integerクラス: static Integer valueOf(String s) Longクラス: static Long valueOf(String s) Floatクラス: static Float valueOf(String s) Doubleクラス: static Double valueOf(String s)例えばIntegerクラスで用意されているvalueOfメソッドは、引数に指定された文字列が表す整数の値を持つIntegerクラスのオブジェクトを返します。実際には次のように記述します。 String str = "124"; Integer oi = Integer.valueOf(str);なお基本データ型の値ではなく対応するラッパークラスのオブジェクトを返す点に注意して下さい。 また数値形式でない文字列を指定したり、範囲を超えた数値形式の文字列を指定した場合には先ほどと同じように実行時エラーが発生します。 コンストラクタを使用する3つ目の方法はラッパークラスのコンストラクタの引数に文字列を指定する方法です。Byteクラス: Byte(String s) Shortクラス: Short(String s) Integerクラス: Integer(String s) Longクラス: Long(String s) Floatクラス: Float(String s) Doubleクラス: Double(String s)例えばIntegerクラスのオブジェクトを作成する時に火異数として文字列を指定すると、引数に指定された文字列が表す整数の値を持つIntegerクラスのオブジェクトを作成します。実際には次のように記述します。 String str = "124"; Integer oi = new Integer(str);数値形式でない文字列を指定したり、範囲を超えた数値形式の文字列を指定した場合には先ほどと同じように実行時エラーが発生します。 では簡単な例で試しておきます。 サンプルプログラム下記のサンプルを実行してみよう。class JSample5_1{ public static void main(String args[]){ String str1 = "124"; String str2 = "73"; String str3 = "4.987"; int i = Integer.parseInt(str1); Byte ob = new Byte(str2); Double od = Double.valueOf(str3); System.out.println(i); System.out.println(ob.byteValue()); System.out.println(od.doubleValue()); } }JDK-23 では、下記の警告(削除マーク)が発生しました。 [xxxxxxxx@dddddddddd Wrapper_class]$ javac JSample5_1.java JSample5_1.java:8: 警告: [removal] ByteのByte(String)は推奨されておらず、 削除用にマークされています Byte ob = new Byte(str2); ^ 警告1個 [xxxxxxxx@dddddddddd Wrapper_class]$上記をコンパイルした後で実行すると次のように表示されます。 [xxxxxxxx@dddddddddd Wrapper_class]$ java JSample5_1 124 73 4.987 [xxxxxxxx@dddddddddd Wrapper_class]$下記のように書き換えると良いようです。
class JSample5_2{
public static void main(String args[]){
String str1 = "124";
String str2 = "73";
String str3 = "4.987";
int i = Integer.parseInt(str1);
// Byte ob = new Byte(str2);
Byte ob = Byte.valueOf(str2);
Double od = Double.valueOf(str3);
System.out.println(i);
System.out.println(ob.byteValue());
System.out.println(od.doubleValue());
}
}
上記をコンパイルした後で実行すると次のように表示されます。[xxxxxxxx@dddddddddd Wrapper_class]$ java JSample5_2 124 73 4.987 [xxxxxxxx@dddddddddd Wrapper_class]$ |
|