Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/370.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将特定于语言环境的字符串转换为BigDecimal的最佳方法_Java_Bigdecimal - Fatal编程技术网

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

Java 将特定于语言环境的字符串转换为BigDecimal的最佳方法,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 =

我必须将格式为
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.8800000000010913936421275138854549046875

线程“main”java.lang.NumberFormatException中出现异常 位于java.math.BigDecimal。(未知源) 位于java.math.BigDecimal。(未知源) main(BigDecimalTest.java:22)

第一个输出是正确的,但将
字符串
转换为
数字
Double
,准确地说),然后再次转换为
字符串
,然后转换为特定类型的
数字
大十进制

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

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


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

问题在于字符串的格式。您应该使用第三种方法,但字符串的格式如下:
stringnumberstring=“2105.88”

您可以从以下示例中看到这一点:

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

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

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

我希望这有帮助

DecimalFormat
有一个名为的方法,该方法使
parse()
返回一个
BigDecimal
。您只需强制转换返回的
编号

    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.105,88
实际上在许多地区都是完全正确格式的。。。在这些地区,
2105.88
根本不合适。整个考验需要的是BigDecimal构造函数的区域设置参数…@JarettMillard实际上
DecimalFormat
有,
NumberFormat
没有这个method@deFreitas
NumberFormat
是一个抽象类。
DecimalFormat
的文档明确告诉您使用
NumberFormat.getInstance()
“NumberFormat是一个抽象类”,它没有这样的方法,这意味着您必须将工厂方法的结果转换回DecimalFormat。