以下のコードがJava数値形式の例外をスローするのはなぜですか?
BigDecimal d = new BigDecimal("10934,375");
問題は、BigDecimal
のコンストラクターが、小数点が小数点コンマ.
ではなく小数点ドット,
の直後に来る10進数形式を必要とするため、この特定の場合の正しい形式は次のようになることです。
BigDecimal d = new BigDecimal("10934.375");
はい、BigDecimal
クラスは、このコンストラクターのJavadocで読み取ることができるように、Locale
を受け取るコンストラクターでString
を考慮しません。
分数は、小数点とそれに続く0桁以上の小数で構成されます。
カンマを小数の区切り文字として使用する別のLocale
に従って解析する場合は、特定のLocale
とともにJava.text.DecimalFormat
を使用する必要があります。
例:
DecimalFormat fmt = new DecimalFormat("0.0", new DecimalFormatSymbols(Locale.GERMAN));
fmt.setParseBigDecimal(true);
BigDecimal n = (BigDecimal) fmt.parse("10934,375");
注:DecimalFormat
(NumberFormat
のサブクラス)のインスタンスを取得して、を呼び出すことができるようにする必要がありますメソッドsetParseBigDecimal
。それ以外の場合は、代わりにDouble
を返します。これは2進浮動小数点数であり、2進浮動小数点数 多くの小数を正確に表すことはできません 。そのため、多くの場合、精度が低下します。
NumberFormatを使用してロケールを選択できます。例を参照してください。
String numberToFormat = "1.900,35";
NumberFormat formatter = NumberFormat.getNumberInstance(Locale.GERMAN);
Number number = formatter.parse(numberToFormat);
BigDecimal decimal = BigDecimal.valueOf(number.doubleValue());