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

前端之家收集整理的这篇文章主要介绍了Java – Decimal Format.parse返回具有指定小数位数的double值前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我希望能够将一个字符串转换为一个Double,给出一个格式字符串中的小数位数.所以“###,## 0.000”应该给我一个双倍到3位的小数位.

编辑 – 添加更多信息发生了什么

用户输入UI中的值 – 输入到String中.规则是这个值限制在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的双精度.

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

干杯,

Andez

解决方法

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);

几个注释:

>输入解析应与输出格式保持分开.特别是当你开始投掷多个区域设置.>允许标准库为确定给定区域设置的有效输入值做出了很大的举措.您只需要选择适当的区域设置(我选择了德国,但这显然与其他人合作).始终使用语言环境.不要尝试重新创建格式化字符串.>从任何输出格式中始终存储您的输入值SEPARATE. IE,如果你想在输出中只显示三位数字,那没关系,但是存储整个double值.

猜你在找的Java相关文章