我希望能够将一个字符串转换为一个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值.