JDK-8167174 : Parsing a string to a double in Finnish throws exception. Java is not respecting the Locale
  • Type: Bug
  • Component: core-libs
  • Sub-Component: java.text
  • Affected Version: 7,8,9
  • Priority: P4
  • Status: Closed
  • Resolution: Duplicate
  • OS: generic
  • CPU: generic
  • Submitted: 2016-10-03
  • Updated: 2016-10-05
  • Resolved: 2016-10-05
Related Reports
Duplicate :  
Description
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 ----------


Comments
This is a duplicate of JDK-4510618 which was raised for French locale using space as thousands separator. This one is about Finnish locale , which also uses space as thousands separator.
05-10-2016