DecimalFormat国家问题

时间:2013-08-22 20:34:10

标签: android numberformatexception decimalformat

我的应用程序中有以下代码行将我的百分比四舍五入到合理的长度;

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

5 个答案:

答案 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

您有几种方法可以解决问题:

  1. 使用相同的DecimalFormat对象进行格式化和解析。

  2. 使用不同的舍入算法。例如:

    double roundToHundredths(double d) {
        return (int)(d * 100) / 100.0;
    }
    
  3. 将号码存储为“百分之一”中的int。使用此int进行计算并将其显示为小数。

  4. 使用BigDecimal可获得更高的精确度。

  5. 请注意,在任何进一步的计算中使用“舍入”数字仍然很棘手,因为浮点数不精确。这意味着“舍入”结果不一定完全正确。

答案 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...

它会将所有,变为.