web-dev-qa-db-ja.com

ロケール固有の文字列をBigDecimalに変換する最良の方法

ドイツ語のロケール形式の文字列をBigDecimalに変換する必要があります。しかし、私は最善の解決策に苦労しています。

次のコードは私の問題を示しています。

    String numberString = "2.105,88";

    NumberFormat nf = NumberFormat.getInstance(Locale.GERMAN);
    try {
        Number parsed = nf.parse(numberString);
        BigDecimal bd1 = new BigDecimal(parsed.toString());
        System.out.println(bd1.toString());

        BigDecimal bd2 = new BigDecimal(parsed.doubleValue());
        System.out.println(bd2);

        BigDecimal bd3 = new BigDecimal(numberString);
        System.out.println(bd3);

    } catch (ParseException e) {
        e.printStackTrace();
    }

これのアウトプットは

2105.88

2105.8800000000001091393642127513885498046875

Test.BigDecimalTest.main(BigDecimalTest.Java:22)のJava.math.BigDecimal。(Unknown Source)のJava.math.BigDecimal。(Unknown Source)のJava.lang.NumberFormatExceptionスレッド「main」の例外

最初の出力は正しいですが、StringNumber(正確にはDouble)に変換してからStringをもう一度、特定のタイプのNumberBigDecimalに。

2番目の出力は正しくありませんが、BigDecimalのスケールを設定することで解決できます。ただし、桁数は常にわかっているとは限りません。

3番目の出力は、明らかに私が探しているものではありません。

私の質問、最良の方法は何でしょうか?これを行うより良い方法はありますか?

30
Gijs Overvliet

Java.Lang.NumberにはBigDecimal型を返すメソッドがないため、他の方法はないようです。とにかく、BigDecimalは "" 2.105,88 "ではなく、" 2105.88 "のように適切にフォーマットされた文字列のみを受け入れるため、理にかなっています。

import Java.math.BigDecimal;
import Java.text.DecimalFormat;
import Java.text.NumberFormat;
import Java.text.ParseException;
import Java.util.Locale;
public class JavaMain {
    public static void main(String[] args) {
        String numberString = "2.105,88";
        //using casting
        try {
            DecimalFormat df = (DecimalFormat) NumberFormat.getInstance(Locale.GERMAN);
            df.setParseBigDecimal(true);
            BigDecimal bd = (BigDecimal) df.parseObject(numberString);
            System.out.println(bd.toString());
        } catch (ParseException e) {
            e.printStackTrace();
        }
        //your way short version
        NumberFormat nf = NumberFormat.getInstance(Locale.GERMAN);
        try {
            BigDecimal bd1 = new BigDecimal(nf.parse(numberString).toString());
            System.out.println(bd1.toString());
        } catch (ParseException e) {
            e.printStackTrace();
        }
        String numberStringFixed = "2105.88";
        //direct string formated
        System.out.println(new BigDecimal(numberStringFixed));;     
        //direct but erroneous way if the string is not formated
        System.out.println(new BigDecimal(numberString));;

    }
}

これがお役に立てば幸いです!

34
PbxMan

DecimalFormatには setParseBigDecimal というメソッドがあり、parse()BigDecimal。返されたNumberをキャストするだけです。

12
Jarett Millard