Java DecimalFormat问题

标签 java decimal locale

我想在 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);
    }

}

您有什么想法是错误或遗漏的吗?

谢谢, 阁楼

最佳答案

您正在尝试使用需要逗号(如德语)的模式进行解析,但您已经给了它一个句点(“0.459”)。看起来 DecimalFormat 在看到不理解的字符时停止解析。如果将其更改为“0,459”,您将看到它正确解析,然后输出“0.459”。 (我不确定 System.out.println 是否使用系统默认区域设置,在这种情况下,它可能会根据您的区域设置打印“0,459”。)

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

下面的代码将执行 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 方法来执行此操作。

关于Java DecimalFormat问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3247726/

相关文章:

java - ArrayList空指针异常

python - 在 Python 中乘以 Decimal 时的精度损失

java - 将小数转换为分数

c++ - en_US.UTF-8 语言环境的 Windows 等效项是什么?

mysql - 如何在同一个 MySQL 命令中将日期字段格式化为不同的语言?

c++ - 空的语言环境参数是什么意思?

java - Hibernate:使用 Ctriteria API 从两个链接表中获取数据

java - Hibernate 中实体集合的陷阱

c - C 中的二进制到十进制的转换 - 输入大小问题

java - 获取 mysql(innodb) AUTO_INCRMENT Column 的方式、JDBC/getGenerateKeys()/last_insert_id (OkPacket 中) 和 LAST_INSERT_ID()