java - 将特定于语言环境的字符串转换为 BigDecimal 的最佳方法

标签 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 转换为 Number (准确地说是 Double ),然后再回到一个String,再回到一个特定类型的NumberBigDecimal

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

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

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

最佳答案

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

我希望这会有所帮助!

关于java - 将特定于语言环境的字符串转换为 BigDecimal 的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12836647/

相关文章:

java - java中的指数

Java 的 Bigdecimal.divide 和 rounding

java - 根据最大字符限制优化 BigDecimal 格式

java - 未报告的异常处理

java - 通过反射从View中获取OnTouchListener对象

java - 如何将外部类文件添加到新的java项目中

java - 多个构造函数的替代方案

java - JSTL 中的 BigDecimal,除以 int 或 double 返回整数

java - int 除以 int 得到 BigDecimal

java - 扩展类型参数的内联类