Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-8167174

Parsing a string to a double in Finnish throws exception. Java is not respecting the Locale

XMLWordPrintable

    • generic
    • generic

      FULL PRODUCT VERSION :
      java version "1.7.0_45"
      Java(TM) SE Runtime Environment (build 1.7.0_45-b18)
      Java HotSpot(TM) 64-Bit Server VM (build 24.45-b08, mixed mode)

      ADDITIONAL OS VERSION INFORMATION :
      Microsoft Windows [Version 6.1.7601]

      A DESCRIPTION OF THE PROBLEM :
      Finland and several other countries separate thousands groups with a space. I am getting a NumberFormatException parsing a String to a double in a Finnish locale.

      A Finnish string can look like this: "12 345 678,999"

      STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
      1. Set your locale to Finnish, Finland
      2. Try to parse or format a Finnish String to a double.

      I have tried the following:
      Locale finnish = new Locale("fi", "FI");
      Locale.setDefault(finnish);

      NumberFormat numFmNi = NumberFormat.getNumberInstance(finnish);
      NumberFormat numFm = NumberFormat.getInstance(finnish);

      DecimalFormat decFmNi = (DecimalFormat)numFmNi;
      DecimalFormat decFm = (DecimalFormat)numFm;
      decFmNi.applyPattern("#.##");
      decFm.applyPattern("#.##");

      Number numberFmNi2 = decFmNi.parse("9 123,45"); // no, result = 9
      Number numberFmNi3 = numFmNi.parse("9 123,45"); // no, result = 9
      Number numberFm2 = decFm.parse("9 123,45"); // no, result = 9
      Number numberFm3 = numFm.parse("9 123,45"); // no, result = 9

      double dNumberFmNi2 = numberFmNi2.doubleValue( );
      double dNumberFmNi3 = numberFmNi3.doubleValue( );
      double dNumberFm2 = numberFm2.doubleValue( );
      double dNumberFm3 = numberFm3.doubleValue( );
      //Number number1 = numFm.parse(numFm.format("9 123,45")); // no, get exception
      //Number number1 = numFmNi.parse(decFmNi.format("9 123,456"));// no, get exception
      //Number number1 = numFm.parse(decFm.format("9 123,456")); // no, get exception
      //double d10 = Double.parseDouble("9 123,45"); // NumberFormatException

      EXPECTED VERSUS ACTUAL BEHAVIOR :
      EXPECTED -
      I expect to get a valid double = 9123.45
      ACTUAL -
      From Sysout -
      dNumberFmNi2 = 9.0
      dNumberFmNi3 = 9.0
      dNumberFm2 = 9.0
      dNumberFm3 = 9.0

      ERROR MESSAGES/STACK TRACES THAT OCCUR :
      this line: double d10 = Double.parseDouble("9 123,45");
      Produces this exception: java.lang.NumberFormatException: For input string: "9 123,45"

      this line: Number number1 = numFm.parse(numFm.format("9 123,45"));
      Produces this exception: java.lang.IllegalArgumentException: Cannot format given Object as a Number

      REPRODUCIBILITY :
      This bug can be reproduced always.

      ---------- BEGIN SOURCE ----------
      Locale finnish = new Locale("fi", "FI");
      Locale.setDefault(finnish);

      NumberFormat numFmNi = NumberFormat.getNumberInstance(finnish);
      DecimalFormat decFmNi = (DecimalFormat)numFmNi;
      decFmNi.applyPattern("#.##");

      try {
      //
      // These will cause an exception
      //
      //Number number1 = numFm.parse(numFm.format("9 123,45")); // exception
      //Number number1 = numFmNi.parse(decFmNi.format("9 123,456"));// exception
      //Number number1 = numFm.parse(decFm.format("9 123,456")); // exception
      //double d10 = Double.parseDouble("9 123,45"); // NumberFormatException

      //
      // These don't cause an exception, but the result is not correct
      //
      Number numberFmNi2 = decFmNi.parse("9 123,45"); // no, result = 9
      Number numberFmNi3 = numFmNi.parse("9 123,45"); // no, result = 9

      double dNumberFmNi2 = numberFmNi2.doubleValue( );
      double dNumberFmNi3 = numberFmNi3.doubleValue( );

      System.out.println( "dNumberFmNi2 = " + numberFmNi2.doubleValue( ) );
      System.out.println( "dNumberFmNi3 = " + numberFmNi3.doubleValue( ) );
      } catch (Exception ex) {
      ex.printStackTrace();
      }
      ---------- END SOURCE ----------

            psonal Pallavi Sonal (Inactive)
            webbuggrp Webbug Group
            Votes:
            0 Vote for this issue
            Watchers:
            2 Start watching this issue

              Created:
              Updated:
              Resolved: