43

Stringにフォーマットされたドイツ語ロケールを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

スレッド「メイン」での例外 java.lang.NumberFormatException at java.math.BigDecimal.(Unknown Source) at java.math.BigDecimal.(Unknown Source) at test.BigDecimalTest.main(BigDecimalTest.java:22)

String最初の出力は正しいですが、 aを a にNumber(Double正確には) 変換してから、String再び a に戻し、特定の型のNumber,に変換するのはあまり意味がありませんBigDecimal

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

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

私の質問: 最善の方法は何ですか? これを行うためのより良い方法はありますか?

4

2 に答える 2

44

java.Lang.Number型を返すメソッドがないので、他に方法がないようBigDecimalです。とにかく、 likeではなくBigDecimallike のように適切にフォーマットされた文字列のみを受け入れるため、それは理にかなっています。"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 formatted
        System.out.println(new BigDecimal(numberStringFixed));;     
        //direct but erroneous way if the string is not formatted
        System.out.println(new BigDecimal(numberString));;
        
    }
}

これが役立つことを願っています!

于 2012-10-12T00:54:57.250 に答える
30

DecimalFormatを返すsetParseBigDecimal原因となる呼び出されたメソッドがあります。返された をキャストするだけです。parse()BigDecimalNumber

    String numberString = "2.105,88";

    NumberFormat nf = NumberFormat.getInstance(Locale.GERMAN);
    if (nf instanceof DecimalFormat) {
        DecimalFormat df = (DecimalFormat) nf;
        df.setParseBigDecimal(true);
        BigDecimal parsed = (BigDecimal) df.parse(numberString);

        System.out.println(parsed);
    }

出力:

2105.88

setParseBigDecimalJava 1.5 で導入されました。

于 2013-05-28T15:36:45.170 に答える