【问题标题】:NumberFormatException occurs with different regional settingsNumberFormatException 发生在不同的区域设置中
【发布时间】:2012-12-22 23:41:37
【问题描述】:

我正在用 Java 开发一个应用程序,发现这种奇怪的行为:

如果通过控制面板将区域设置格式设置为匈牙利语(系统默认),我会收到此异常,但如果我将其设置为英语,则效果很好。还可以在我最初开发程序的虚拟 Mandriva 上工作。

这是导致问题的代码sn-p:

public String stattxt(){
    double dt = time_avg();
    double bpm = (Double.compare(dt, 0) == 0) ? 0 : msec2bpm(dt);
    String s = "<html>Number of control points: " + timestamps.size() + "<br>Average dt: " +
        Double.valueOf(new DecimalFormat("#.####").format(dt).toString()) + " ms<br>" +
        "Average BPM: " + Double.valueOf(new DecimalFormat("#.####").format(bpm).toString()) + "<br>&nbsp</html>";
    return s;
}

time_avg()msec2bpm 都返回双精度值(绝不是双精度值)。

无论区域设置如何,我如何才能使这项工作正常进行?任何帮助将不胜感激。

【问题讨论】:

  • 是的,有些地区不使用句点来表示小数,而是使用逗号。

标签: java settings numberformatexception regional


【解决方案1】:

你好像在用

Double.valueOf(new DecimalFormat("#.####").format(dt).toString())

将一个数字四舍五入到小数点后 4 位,但这对我来说似乎是一个 hack,并且由于区域化设置而失败(匈牙利可能使用小数点逗号,而不是小数点。)

所以,改为使用类似的东西来进行双打:

rounded = Math.round(original * 10000)/10000.0;

而且,如果你想创建一个双舍入到小数点后 4 位的字符串,请使用 String.format()

String.format("%.4f", original);

【讨论】:

  • 因为这个答案首先到达我立即尝试并按预期工作,谢谢! (因为我刚刚注册,所以不能投票。)
【解决方案2】:

看起来你应该跳过Double.valueOf

public String stattxt(){
    double dt = time_avg();
    double bpm = (Double.compare(dt, 0) == 0) ? 0 : msec2bpm(dt);
    String s = "<html>Number of control points: " + timestamps.size() + "<br>Average dt: " +
        new DecimalFormat("#.####").format(dt) + " ms<br>" +
        "Average BPM: " + new DecimalFormat("#.####").format(bpm) + "<br>&nbsp</html>";
    return s;
}

【讨论】:

    【解决方案3】:

    为什么要将String 转换为Double,然后再转换为String?这样做:

    public String stattxt(){
        double dt=time_avg();
        double bpm=(Double.compare(dt, 0)==0)?0:msec2bpm(dt);
        String s="<html>Number of control points: "+timestamps.size()+"<br>Average dt: "+
            new DecimalFormat("#.####").format(dt).toString()+" ms<br>"+
                    "Average BPM: "+Double.valueOf(new DecimalFormat("#.####").format(bpm).toString())+"<br>&nbsp</html>";
        return s;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-31
      • 1970-01-01
      • 2020-05-29
      • 2016-04-27
      相关资源
      最近更新 更多