Java - Decimal Format.parse 以返回具有指定小数位数的 double 值

标签 java parsing decimal rounding decimalformat

我希望能够将字符串转换为 Double,给定格式字符串中的小数位数。所以“###,##0.000”应该给我 Double 到小数点后 3 位。

编辑 - 为发生的事情添加了更多信息

用户在 UI 中输入值 - 该值被输入到一个字符串中。规则是此值限制为小数点后 3 位。底层代码将值存储在数据库中,然后用于计算。因此,尾随小数位会导致计算结果略微超出预期。

我有以下代码:

try {
        // output current locale we are running under (this happens to be "nl_BE")
        System.out.println( "Current Locale is " + Locale.getDefault().toString() );

        // number in Central European Format with a format string specified in UK format
        String numberCE = "1,234567"; // 1.234567
        String formatUK = "###,##0.000";

        // do the format
        DecimalFormat formatterUK = new DecimalFormat( formatUK );
        Double valCEWithUKFormat = formatterUK.parse( numberCE ).doubleValue();

        // I want the number to DPs in the format string!!!
        System.out.println( "CE Value     " + numberCE + " in UK format (" + formatUK + ") is "
        + valCEWithUKFormat );

    } catch( ParseException ex ) {
        System.out.println("Cannot parse number");
    }
}

DecimalFormat 似乎忽略了格式字符串并给我完整的字符串作为 1.234567 的 Double

DecimalFormat解析的时候可以强制使用格式字符串吗?我错过了什么吗?

干杯,

安德斯

最佳答案

DecimalFormat 用于两个不同目的:解析输入和格式化输出。如果您想同时执行这两项操作,则必须使用格式对象两次。

如果要获取该值并格式化输出,限制有效数字的数量,则需要再次使用格式对象。这次它使用您的格式化规则从数值创建输出字符串:

String output = formatterUK.format(valCEWithUKFormat.doubleValue() );

这将为您提供 1,235

的输出

您似乎希望此数值以 1.235 格式显示。为此,您应该使用特定语言环境格式化输出(如果您使用不同的格式)。

但是,我建议以不同的方式解决这个问题:

String text = "1,234567";
NumberFormat nf_in = NumberFormat.getNumberInstance(Locale.GERMANY);
double val = nf_in.parse(text).doubleValue();

NumberFormat nf_out = NumberFormat.getNumberInstance(Locale.UK);
nf_out.setMaximumFractionDigits(3);
String output = nf_out.format(val);

一些注意事项:

  • 输入解析应与输出格式化分开。特别是当您开始投入多个语言环境时。
  • 允许标准库执行繁重的工作,以确定给定区域设置的有效输入值。您只需要选择一个合适的语言环境(我选择了德国,但这显然适用于其他语言环境)。尽可能使用语言环境。不要尝试重新创建格式字符串。
  • 始终将您的输入值与任何输出格式分开存储。 IE,如果您只想在输出中显示三位数字,那很好,但无论如何都要存储整个 double 值。

关于Java - Decimal Format.parse 以返回具有指定小数位数的 double 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4738853/

相关文章:

java - MySQL 数据库在 8 小时后断开连接。如何预防?

java - Android 中没有互联网的 GPS 信息

java - 在 java 中以编程方式生成 XSD

java - 当元素具有空值时如何接受 xsd vs xml 验证

c# - 通过查看字节来检查 decimal 是否包含小数位

c - 两个二进制数异或的问题

Python 的丰富比较行为(或者,当 Decimal ('100.0' 时)< .01)

c# - Java 中哪个最好;模拟接口(interface)还是模拟类?

parsing - 如何从命令行反转 Linux 中文件的列顺序

java - 从多个类中绘制图形?