将Locale特定String转换为BigDecimal的最佳方法

Gij*_*iet 33 java bigdecimal

我必须将德语区域设置格式化的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();
    }
Run Code Online (Sandbox Code Playgroud)

这个的出局是

2105.88

2105.8800000000001091393642127513885498046875

java.math.BigDecimal中的java"主要"java.lang.NumberFormatException中的异常java.math.BigDecimal.(未知来源)test.BigDecimalTest.main(BigDecimalTest.java:22)

第一输出是正确的,但它并没有真正意义的一个转换StringNumber(Double要准确),然后回String再次,然后进入特定类型的Number,BigDecimal.

第二个输出不正确,但可以通过设置BigDecimal的比例来解决.但是,数字量并不总是已知.

第三个输出显然不是我想要的.

我的问题是,最好的方法是什么?有没有更好的方法来做到这一点?

Pbx*_*Man 35

似乎没有其他办法,因为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));;

    }
}
Run Code Online (Sandbox Code Playgroud)

我希望这有帮助!

  • 至于"格式正确"......"2.105,88"实际上在一堆语言环境中完全正确格式化......在这些语言环境中,"2105.88"根本不适合.整个考验需要的是BigDecimal构造函数的Locale参数...... (4认同)

Jar*_*ard 13

DecimalFormat有一个被调用的方法setParseBigDecimal导致parse()返回a BigDecimal.你只需要投射返回的Number.

  • @ aberrant80我联系的文档说"自:1.5." (2认同)
  • “NumberFormat 是一个抽象类”,它没有这样的方法,这意味着您必须将工厂方法的结果转换回 DecimalFormat。 (2认同)