安全字符串到BigDecimal转换

bez*_*max 117 java parsing bigdecimal

我正在尝试从字符串中读取一些BigDecimal值.假设我有这个字符串:"1,000,000,000.999999999999999",我希望得到一个BigDecimal.这样做的方法是什么?

首先,我不喜欢使用字符串替换的解决方案(替换逗号等).我认为应该有一些整洁的格式化程序来为我做这项工作.

我找到了一个DecimalFormatter类,但是因为它运行的时间很长 - 大量的精度都会丢失.

那么,我该怎么做呢?

Jer*_*erg 88

setParseBigDecimal在DecimalFormat中查看.使用此setter,parse将为您返回BigDecimal.

  • 如果你要完全**改变你的答案,我建议在答案中提及它.当人们指出为什么你的原始答案没有任何意义时,它看起来很奇怪.:-) (24认同)
  • 你能提供一个例子吗? (13认同)

Buh*_*ndi 59

String value = "1,000,000,000.999999999999999";
BigDecimal money = new BigDecimal(value.replaceAll(",", ""));
System.out.println(money);
Run Code Online (Sandbox Code Playgroud)

完整代码证明没有NumberFormatException抛出:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

产量

1000000000.999999999999999

  • 所以,这不安全.您不知道所有语言环境. (11认同)
  • 尝试使用GERMAN语言环境,以及1.000.000.000,999999999999 (7认同)
  • 如果您只使用例如[`DecimalFormatSymbols.getInstance().getGroupingSeparator()`](https://docs.oracle.com/javase/7/docs/api/java/text/DecimalFormatSymbols.html#getGroupingSeparator() )而不是逗号,不需要担心不同的语言环境. (3认同)

小智 20

以下示例代码运行良好(需要动态获取区域设置)

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);
    }
}
Run Code Online (Sandbox Code Playgroud)


Tof*_*eer 5

代码可能更干净,但这似乎适用于不同的语言环境.

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);
    }
}
Run Code Online (Sandbox Code Playgroud)