Java(たとえば、int、long、doubleなど))の任意の有効な数値である場合、文字列を抽象的な数値に変換するにはどうすればよいですか?.
文字列内の数値のタイプがわからないため、特定のプリミティブ解析(Integer.parseInt、Long.parseLongなど)を使用できません。それを変換する一般的な方法はありますか?
例えば:
NumberFormatを使用します。数値は抽象クラスであるため、インスタンス化できません。
Number number = NumberFormat.getInstance().parse(string);
Double
は、長すぎると値の精度が失われます。
代わりにBigDecimal
を使用してください:
BigDecimal number = new BigDecimal("43.256");
その後、次のようなさまざまなプリミティブを取得できます。
try {
int intValue = number.intValueExact();
} catch (ArithmeticException e) {
try {
long longValue = number.longValueExact();
} catch (ArithmeticException e) {
double doubleValue = number.doubleValue();
}
}
2つのケース:
double primitiveNumber = Double.parseDouble(input);
Double.parseDouble() を使用して、文字列をdoubleに変換できます。これは、文字列が整数の場合でも機能します。
String myString = "1234.56";
double myDouble = Double.parseDouble(myString);
整数か倍数かを確認する必要がある場合:
String myString = "1234.56";
int myInt;
double myDouble = Double.parseDouble(myString);
if ((myDouble % 1) == 0) {
myInt = (int) myDouble;
System.out.println("myString is an integer: " + myInt );
} else {
System.out.println("myString is a double: " + myDouble );
}
または、 Guava'sDoubleMath.isMathematicalInteger() を使用できます。
String myString = "1234.56";
int myInt;
double myDouble = Double.parseDouble(myString);
if (DoubleMath.isMathematicalInteger(myDouble)) {
myInt = (int) myDouble;
System.out.println("myString is an integer: " + myInt );
} else {
System.out.println("myString is a double: " + myDouble );
}
文字列が大きな数である限り(プリミティブなlongおよびdoubleより長くないと想定)、一般的な方法はそれが長いかdoubleかを決定できます。
Number n = Double.valueOf(string);
if((double)n.intValue() == n.doubleValue()){
//n is double use n.doubleValue() or just use the n for generic purposes
}
else{
//n is int use n.intValue() or just use the n for generic purposes
}
Double.valueOf()
は、数値が非常に長い場合を除き、正常に機能します。
私はBigDecimal
だけを好みます。サイズや精度の問題がないので
これを行う最も簡単な方法は、常にDouble.parseDouble()
を使用することです。常に同じタイプを使用するのではなく、使用するプリミティブを決定する汎用パーサーが必要な場合は、独自のパーサーを作成する必要があります。これを行う1つの方法は、各parseXxx()
メソッドと多数のtry...catch
ステートメントを使用することです。
整数の場合:
int myInteger = Integer.parseInt("23423");
ダブルの場合:
double myDouble = Double.parseDouble("34.3");