DecimalFormat 解析数字错误。为啥?

Posted

技术标签:

【中文标题】DecimalFormat 解析数字错误。为啥?【英文标题】:DecimalFormat is parsing number wrong. Why?DecimalFormat 解析数字错误。为什么? 【发布时间】:2020-05-09 11:14:37 【问题描述】:

我目前创建了一个基本的 Java 应用程序,它允许将提供的数字解析为格式化的字符串。 我现在面临的问题是,DecimalFormat 以错误的格式格式化提供的值。

例子:

private final DecimalFormat format = new DecimalFormat();

public static void main(String[] args)
    int number;
    try
        number = Integer.parseInt(args[0]);
    catch(NumberFormatException ex)
        System.out.println("The provided value was invalid!");
        System.exit(0);
        return;
    

    format.applyPattern("#,###,###.##");

    return format.format(number);
    System.exit(0);

我在这里面临的问题是,例如,如果我在 jar 命令中提供数字 123456789 作为第一个参数,它会返回 123'456'789 而不是 123,456,789 的预期结果。

什么可能导致这个问题?

【问题讨论】:

你检查过你的语言环境吗?可能是默认语言环境已将分组分隔符设置为'。您可以通过format.getDecimalFormatSymbols().getGroupingSeparator() 来检查分组分隔符。 【参考方案1】:

使用java.text.DecimalFormat 导入,以及此代码:

private static final DecimalFormat format = new DecimalFormat();

    public static void main(String[] args) 
        int number = 1456781;

        format.applyPattern("#,###,###.##");

        System.out.println("The formatted version is -> " + format.format(number));
    

我得到的输出是

The formatted version is -> 1,456,781

Process finished with exit code 0

所以它的格式似乎正确?

【讨论】:

【参考方案2】:

我在这里看到的一个问题是,您返回的是Integer,而不是返回中的 void。此外,您正在从静态函数访问非静态函数format。您可以将其移动到您的函数中,或用作静态变量。

private static DecimalFormat format = new DecimalFormat();

public static void main(String[] args)
    int number;
    try
        number = Integer.parseInt(args[0]);
    catch(NumberFormatException ex)
        System.out.println("The provided value was invalid!");
        System.exit(0);
        return;
    

    format.applyPattern("#,###,###.##");

    System.out.println(format.format(number));
    System.exit(0);

如果上述方法不起作用,那么它很可能来自您的语言环境。您可以使用此answer 强制区域设置

【讨论】:

以上是关于DecimalFormat 解析数字错误。为啥?的主要内容,如果未能解决你的问题,请参考以下文章

DecimalFormat 用非数字转换数字

DecimalFormat详解

DecimalFormat格式化输出带小数的数字类型

java 使用DecimalFormat进行数字的格式化实例详解

Java 程序在 jpackage 时使用了错误的语言环境

为啥 DecimalFormat ".#" 和 "0.#" 在 23.0 上有不同的结果?