NumberFormatException происходит с различными региональными настройками

Я разрабатываю приложение на Java и обнаружил это странное поведение:

если для региональных настроек в панели управления установлен венгерский (по умолчанию система), я получаю это исключение, но если я установлю его на английский, он отлично работает. Также работает на виртуальной Mandriva, где я в первую очередь разрабатываю программу.

Это фрагмент кода, который вызывает проблему:

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 вернуть двойные (не Double случайно) значения.

Как я могу сделать это независимо от региональных настроек? Любая помощь будет оценена.

3 ответа

Решение

Кажется, вы используете

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

округлить число до 4 знаков после запятой, но для меня это выглядит как хак и потерпит неудачу из-за настроек регионализации (Венгрия, вероятно, использует десятичную запятую, а не десятичную точку).

Таким образом, вместо округления удваивается что-то вроде:

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

И, если вы хотите создать строку с двойным округлением до 4 знаков после запятой, используйте String.format()

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

Похоже, вы должны просто пропустить 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;
}

Почему вы конвертируете 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;
}
Другие вопросы по тегам