127

文字列からいくつかの BigDecimal 値を読み取ろうとしています。「1,000,000,000.999999999999999」という文字列があり、そこから BigDecimal を取得したいとします。それを行う方法は何ですか?

まず、文字列の置換 (コンマの置換など) を使用したソリューションが好きではありません。私のためにその仕事をするためのきちんとしたフォーマッタが必要だと思います。

DecimalFormatter クラスを見つけましたが、double を介して動作するため、膨大な量の精度が失われます。

それで、どうすればいいですか?

4

9 に答える 9

92

setParseBigDecimalDecimalFormat で確認してください。このセッターを使用parseすると、BigDecimal が返されます。

于 2010-09-20T14:54:11.757 に答える
65
String value = "1,000,000,000.999999999999999";
BigDecimal money = new BigDecimal(value.replaceAll(",", ""));
System.out.println(money);

NumberFormatExceptionnoがスローされたことを証明する完全なコード:

import java.math.BigDecimal;

public class Tester {
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        String value = "1,000,000,000.999999999999999";
        BigDecimal money = new BigDecimal(value.replaceAll(",", ""));
        System.out.println(money);
    }
}

出力

1000000000.999999999999999

于 2010-09-20T14:55:27.297 に答える
24

次のサンプル コードはうまく機能します (ロケールを動的に取得する必要があります)。

import java.math.BigDecimal;
import java.text.NumberFormat;
import java.text.DecimalFormat;
import java.text.ParsePosition;
import java.util.Locale;

class TestBigDecimal {
    public static void main(String[] args) {

        String str = "0,00";
        Locale in_ID = new Locale("in","ID");
        //Locale in_ID = new Locale("en","US");

        DecimalFormat nf = (DecimalFormat)NumberFormat.getInstance(in_ID);
        nf.setParseBigDecimal(true);

        BigDecimal bd = (BigDecimal)nf.parse(str, new ParsePosition(0));

        System.out.println("bd value : " + bd);
    }
}
于 2012-05-15T20:27:49.700 に答える
6

コードはよりきれいになる可能性がありますが、これはさまざまなロケールでうまくいくようです。

import java.math.BigDecimal;
import java.text.DecimalFormatSymbols;
import java.util.Locale;


public class Main
{
    public static void main(String[] args)
    {
        final BigDecimal numberA;
        final BigDecimal numberB;

        numberA = stringToBigDecimal("1,000,000,000.999999999999999", Locale.CANADA);
        numberB = stringToBigDecimal("1.000.000.000,999999999999999", Locale.GERMANY);
        System.out.println(numberA);
        System.out.println(numberB);
    }

    private static BigDecimal stringToBigDecimal(final String formattedString,
                                                 final Locale locale)
    {
        final DecimalFormatSymbols symbols;
        final char                 groupSeparatorChar;
        final String               groupSeparator;
        final char                 decimalSeparatorChar;
        final String               decimalSeparator;
        String                     fixedString;
        final BigDecimal           number;

        symbols              = new DecimalFormatSymbols(locale);
        groupSeparatorChar   = symbols.getGroupingSeparator();
        decimalSeparatorChar = symbols.getDecimalSeparator();

        if(groupSeparatorChar == '.')
        {
            groupSeparator = "\\" + groupSeparatorChar;
        }
        else
        {
            groupSeparator = Character.toString(groupSeparatorChar);
        }

        if(decimalSeparatorChar == '.')
        {
            decimalSeparator = "\\" + decimalSeparatorChar;
        }
        else
        {
            decimalSeparator = Character.toString(decimalSeparatorChar);
        }

        fixedString = formattedString.replaceAll(groupSeparator , "");
        fixedString = fixedString.replaceAll(decimalSeparator , ".");
        number      = new BigDecimal(fixedString);

        return (number);
    }
}
于 2010-09-20T15:16:58.380 に答える
3
resultString = subjectString.replaceAll("[^.\\d]", "");

文字列から数字とドットを除くすべての文字を削除します。

ロケールに対応させるには、getDecimalSeparator()fromを使用することをお勧めしますjava.text.DecimalFormatSymbols。Javaはわかりませんが、次のようになります。

sep = getDecimalSeparator()
resultString = subjectString.replaceAll("[^"+sep+"\\d]", "");
于 2010-09-20T14:57:41.853 に答える
3

これが私がそれを行う方法です:

public String cleanDecimalString(String input, boolean americanFormat) {
    if (americanFormat)
        return input.replaceAll(",", "");
    else
        return input.replaceAll(".", "");
}

明らかに、これが製品コードで行われる場合、それほど単純ではありません。

文字列からコンマを削除するだけで問題はありません。

于 2010-09-20T14:55:19.417 に答える
1

これが私のために働いていることを試してください

BigDecimal bd ;
String value = "2000.00";

bd = new BigDecimal(value);
BigDecimal currency = bd;
于 2015-10-26T10:34:59.517 に答える