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

时间:2012-10-11 09:41:58

标签: 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();
    }

这次的出局是

  

2105.88

     

2105.8800000000001091393642127513885498046875

     

线程“main”java.lang.NumberFormatException中的异常       在java.math.BigDecimal。(未知来源)       在java.math.BigDecimal。(未知来源)       at test.BigDecimalTest.main(BigDecimalTest.java:22)

第一个输出是正确的,但将String转换为Number(确切地说是Double)然后回到{{1}并不合理然后再转换为特定类型的StringNumber

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

第三项输出显然不是我想要的。

我的问题是,最好的方法是什么?有更好的方法吗?

3 个答案:

答案 0 :(得分:32)

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

    }
}

我希望这有帮助!

答案 1 :(得分:10)

DecimalFormat有一个名为setParseBigDecimal的方法会导致parse()返回BigDecimal。您只需要转换返回的Number

答案 2 :(得分:-4)

问题是String的格式。你应该使用第三种方法,但是格式化你的字符串:String numberString = "2105.88";

您可以从这里给出的示例中看到这一点: Link to Java Api

编辑: 好的,所以我看到了两种可能的解决方案。要么使用您的解决方案1(这是我更喜欢的),要么执行以下操作:

numberString = numberString.replaceAll(".", "");
numberString = numberString.replaceAll(",", ".");
BigDecimal bd3 = new BigDecimal(numberString);