Search code examples
javasettingsnumberformatexceptionregional

NumberFormatException occurs with different regional settings


I'm developing an application in Java and found this strange behaviour:

if the regional settings format is set to Hungarian (system default) via the Control Panel, I get this exception, but if I set it to an English one, it works perfectly. Also works on a virtual Mandriva where I'm developing the program in the first place.

This is the code snippet that causes the problem:

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;
}

where both time_avg() and msec2bpm return double (not Double by any chance) values.

How could I make this work regardless to regional settings? Any help would be appreciated.


Solution

  • It seems like you're using

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

    to round a number to 4 decimal places, but this looks like a hack to me and will fail due to regionalization settings (Hungary probably uses a decimal comma, not a decimal point.)

    So, instead round doubles using something like:

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

    And, if you want to create a string which is a double rounded to 4 decimal places, use String.format()

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