我的应用程序中有以下代码行将我的百分比四舍五入到合理的长度;
double percentage = ((double)correct*100)/((double)total);
DecimalFormat df = new DecimalFormat("#.0");
percentage = Double.valueOf(df.format(percentage));
此代码在99%的情况下运行良好,但是当来自某些欧洲国家/地区的人使用此代码时,崩溃会给我一个NumberFormatException
。
这是因为当DecimalFormat
对双56.7777
进行舍入时,它会将其四舍五入为56,8
(带逗号),这意味着当我尝试将其转换为双精度时,抛出NumberFormatException。
有没有办法将地点设置为DecimalFormat
,以便我知道它总是会转到56.8
而不是56,8
?
答案 0 :(得分:2)
使用相同的数字格式来解析数据
percentage = df.parse(df.format(percentage), new ParsePosition(0))
其他解决方案是设置自己的格式符号
DecimalFormat df = new DecimalFormat('#.0', new DecimalFormatSymbols())
我建议先解决。我在使用逗号作为小数分隔符的语言环境中测试了它。
答案 1 :(得分:1)
NumberFormat numberFormat = NumberFormat.getNumberInstance(context.getResources().getConfiguration().locale); // Locale.getDefaultLocale()
DecimalFormat decimalFormat = (DecimalFormat)numberFormat;
char separator =decimalFormat.getDecimalFormatSymbols().getDecimalSeparator();
decimalFormat.applyPattern("#".concat(Character.toString(separator)).concat("0"));"
您需要根据Locale
答案 2 :(得分:1)
问题是您使用DecimalFormat
指定自定义格式,然后使用默认String
指定的格式解析生成的Locale
。
您有几种方法可以解决问题:
使用相同的DecimalFormat
对象进行格式化和解析。
使用不同的舍入算法。例如:
double roundToHundredths(double d) {
return (int)(d * 100) / 100.0;
}
将号码存储为“百分之一”中的int
。使用此int
进行计算并将其显示为小数。
使用BigDecimal
可获得更高的精确度。
请注意,在任何进一步的计算中使用“舍入”数字仍然很棘手,因为浮点数不精确。这意味着“舍入”结果不一定完全正确。
答案 3 :(得分:0)
您可以为测试值设置货币,然后格式化并查找是否有逗号或。并妥善处理,如果,
DecimalFormat test = new DecimalFormat(“0.00”); test.setCurrency(C);
String testsample = test.format(1.23); char ch = sample.indexOf(“。”)> 0? “” :“,”;
答案 4 :(得分:0)
将小数转换为字符串并将其应用于
str = str.replaceAll(",","."); // or "\\.", it doesn't matter...
它会将所有,
变为.