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