Java: what's the difference between the sv and sv_SE locale?

d-b picture d-b · Oct 8, 2014 · Viewed 8.2k times · Source

I tried to parse a string (-0,3) to a double in java using Swedish locale using this code:

String DoubleString = "-0,3"
NumberFormat swedishNumberFormat = NumberFormat.getInstance(new Locale("sv"));
System.out.println(swedishNumberFormat.parse(doubleString).doubleValue());

When I tried with the sv_SE locale the result was -3.0, which, obviously, is incorrect. I then, after a lot of headache changed the locale to sv (as in the example above) and then the result was correct, -0,3.

According to http://www.localeplanet.com/java/sv/index.html and http://www.localeplanet.com/java/sv-SE/index.html the decimal separator (Decimalavgränsare) in both cases is comma (,) so why this difference?

(I tried to tag this with some tags related to Sweden such as sv_SE but I didn't have enough reputation points to add new tags. Feel free to add tags if you can.)

Answer

Serhiy picture Serhiy · Oct 8, 2014

If you try to create Locale like new Locale("sv_SE"), then it will fail to match it through the ISO 639 standard used to detect language (yes if there is only one parameters it is threatened as language, check the documentation). In your case you should use new Locale("sv","SE") to correctly setup the country, otherwise, since the matching for language fails, default language is used (which in your case seem to be English). In English, the comma is used for digit grouping and not as decimal mark, that is why the result you have in unexpected but correct.