我想用Java的德语语言环境格式化double类型的数字。但是,由于以下代码的输出是错误的:0.0

package main;

import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.text.ParseException;
import java.util.Locale;

public class Test {

    private static String decimal2Format = "000.000";

    public static void main(String args[]){
        DecimalFormat format = (DecimalFormat)NumberFormat.getInstance(new Locale("de"));
        double value = 0;
        try {
            format.applyPattern(decimal2Format);
            value = format.parse("0.459").doubleValue();
        } catch (ParseException e) {
            e.printStackTrace();
        }

        System.out.println(value);
    }

}


您有什么想法是对的还是缺失的?

谢谢,
tic

最佳答案

您正在尝试使用期望逗号(如德语)的模式进行解析,但是给了它一个句点(“ 0.459”)。看起来DecimalFormat看到无法理解的字符时就停止解析。如果将其更改为“ 0,459”,则会看到它正确解析,然后输出“ 0.459”。 (我不确定System.out.println是否使用系统默认语言环境,在这种情况下,它可能会根据您的语言环境显示“ 0,459”。)

请注意,您根本没有尝试在此代码中格式化数字-仅分析数字。如果要格式化,请调用格式。 double本身没有关联的格式-只是一个数字。这不像使用特定格式化程序进行解析会返回保留该格式的值。

以下代码将执行双精度值的实际格式设置:

DecimalFormat format = (DecimalFormat)NumberFormat.getInstance(new Locale("de"));
double value = 0.459;
String formatted = format.format(value);
System.out.println(formatted); // Prints "0,459"


编辑:好的,听起来您正在将其从一种格式转换为另一种格式(例如,从美国转换为欧洲)。这意味着您可能应该使用两个不同的DecimalFormat对象-您可以在调用之间切换语言环境,但这对我来说听起来有些严峻。

我相信解析和检测错误的一种方法是使用parse重载,该重载也需要ParsePosition。将位置设置为0开始,然后检查它是否在字符串的末尾-如果不是,则意味着解析实际上失败了。我感到奇怪的是,没有一种方法可以自动执行此操作并引发异常,但是我看不到...

如果要处理本质上更逻辑上为十进制的值,则可能还需要将解析器设置为生成BigDecimal而不是double。您可以使用setParseBigDecimal方法执行此操作。

09-05 07:30