数値のInt型や文字列のString型を混在させて文字表示する、あるいは値が文字列で返ってきた場合に数値に変換したい場合があります。数値と文字列型の変換をJavaでどうするのか確認してみましょう。
数値型-文字列 変換
あくまでAndroidでのJavaとなります。Javaの最新機能をサポートしているとは限りません、注意点もありますが、基本的な変換は以下のようになります。
- int型からString型に変換
12int num01 = 5;String str01 = String.valueOf( num01 );
注)文字連結では使わなくてもいい
- String型からInt型に変換
12String str01 = "6";int num01 = Integer.parseInt( str01 );
注)文字列が数値に変換できる前提
- double型からString型に変換
12double dnum01 = 123.456;String str01 = String.valueOf( dnum01 );
注)指数表記になる場合はBigDecimalを使う
- String型からdouble型に変換
12String str01 = "123.456";double dnum01 = Double.parseDouble( str01 );
- int型とdouble型の変換
12int num01 = 8;double dnum01 = (double)num01;
12double dnum01 = 123.456;int num01 = (int)dnum01;
int -> String
String.valueOf() を使ってintからStringに変換します
1 2 3 4 |
int num01 = 5; String str01 = String.valueOf( num01 ); Log.v("debug", str01); |
Logcatでは
1 |
V/debug: 5 |
ただし、文字列と数値が混在する場合は
1 2 3 |
String str02 = "str02 = " + String.valueOf( num01 ); Log.v("debug", str02); |
Logcatでは、
1 |
V/debug: str02= 5 |
問題はないですが、warningが出るようになりました
1 2 3 |
String str02 = "str02 = " + num01; Log.v("debug", str02); |
「+」演算子で結合するだけでいいようです。
String -> int
Integer.parseInt() を使ってString型からint型へ変換
1 2 3 4 |
String str01 = "6"; int num01 = Integer.parseInt(str01); Log.v("debug", "num01 = " + num01); |
Logcatでは
1 |
V/debug: num01 = 6 |
文字列から数値型へ変換して計算もできます
1 2 3 4 5 |
String strA = "123"; String strB = "456"; int num02 = Integer.parseInt(strA) + Integer.parseInt(strB); Log.v("debug", "num02 = " + num02); |
Integer.valueOf() を使うこともできます
1 |
V/debug: num02 = 579 |
1 2 3 4 |
String str03 = "7"; int num03 = Integer.valueOf(str03); Log.v("debug", "num03 = " + num03); |
1 |
V/debug: num03 = 7 |
ただし、これはwarningがでます。Integer.valueOf()は内部でInteger.parseInt()を使っているので Integer.parseInt()にした方がいいようです。
この変換においては注意点があります
Stringが数値に置き換えられない場合はエラーになりクラッシュします。
1 2 3 4 |
String strC = "abc123"; int num04 = Integer.parseInt(strC) ; Log.v("debug", "num04 = " + num04); |
1 |
java.lang.NumberFormatException: For input string: "abc123" |
Stringが数値型として有効でないか不明であればtry catchでクラッシュしないようにします
1 2 3 4 5 6 7 8 9 10 |
String strC = "abc123"; try{ int num04 = Integer.parseInt(strC) ; Log.v("debug", "num04 = " + num04); } catch (NumberFormatException ex){ ex.printStackTrace(); } |
double -> String
intと同じように、String.valueOf() を使ってdouble型に変換できます
1 2 3 4 |
double dnum01 = 123.456; String str01 = String.valueOf(dnum01); Log.v("debug", "str01 = " + str01); |
1 |
V/debug: str01 = 123.456 |
doubleの場合では、小数点以下の桁数が多いと指数表記となることがあります。
1 2 3 4 |
double dnum02 = 0.000123456; String str02 = String.valueOf(dnum02); Log.v("debug", "str02 = " + str02); |
1 |
V/debug: str02 = 1.23456E-4 |
BigDecimalを使うと指数表記を避けられます (Javaのライブラリを入れます)
1 2 3 4 5 6 |
import java.math.BigDecimal; ... double dnum03 = 0.000123456; BigDecimal str03 = BigDecimal.valueOf(dnum03); Log.v("debug", "str03 = " + str03.toPlainString()); |
1 |
V/debug: str03 = 0.000123456 |
String -> double
Stringからdoubleに変換するには Double.parseDouble() を使います
1 2 3 4 |
String str01 = "123.456"; double dnum01 = Double.parseDouble(str01); Log.v("debug", "dnum01 = " + dnum01); |
1 |
V/debug: dnum01 = 123.456 |
int <-> Double
例えばこのような場合はint型を(double)でキャストします
1 2 3 4 5 |
int num01 = 8; double dnum01 = 2.45; double dnum02 = (double)num01 + dnum01; Log.v("debug", "dnum02 = " + dnum02); |
1 |
V/debug: dnum02 = 10.45 |
このケースではキャストがなくてもエラーにはなりません
double値は(int)でキャストします
1 2 3 4 5 |
int num01 = 8; double dnum01 = 2.45; int num02 = num01 + (int)dnum01; Log.v("debug", "num02 = " + num02); |
1 |
V/debug: num02 = 10 |
ただ、この場合小数点以下の値が失われてしまいます
キャストをしない場合は
1 2 3 |
int num01 = 8; double dnum01 = 2.45; int num02 = num01 + dnum01; |
エラーになります