有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

Exception in thread "main" java.lang.NumberFormatException at java.math.BigDecimal.(Unknown Source) at java.math.BigDecimal.(Unknown Source) at test.BigDecimalTest.main(BigDecimalTest.java:22)

第一个输出是正确的,但将String转换为NumberDouble精确地说),然后再转换回String,然后转换成特定类型的NumberBigDecimal是没有意义的

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

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

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


共 (2) 个答案

  1. # 1 楼答案

    DecimalFormat有一个名为^{}的方法,它使parse()返回BigDecimal。您只需要对返回的Number进行强制转换

        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

    setParseBigDecimal是在Java1.5中引入的

  2. # 2 楼答案

    似乎没有其他方法,因为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 formatted
            System.out.println(new BigDecimal(numberStringFixed));;     
            //direct but erroneous way if the string is not formatted
            System.out.println(new BigDecimal(numberString));;
            
        }
    }
    

    我希望这有帮助