The Problem
Our C# application sent a query to Solr server, and parsing the response. It works fine, until recently one of our customers hits one exception:
Exception Message [Input string was not in a correct format.]
System.Number.ParseDouble(String value, NumberStyles options, NumberFormatInfo numfmt)
at System.Double.Parse(String s, NumberStyles style)
The Root Cause
Check the language settings, the server machine is using Finnish:fi-FI.
The Solr response always uses en-US locale format for numbers, it uses "." period as decimal separator:
<double name="min">10.01</double>
But in fi-FI[Finnish(Finland)], it uses "," comma as decimal separator.
This would cause double.parse fail to parse the string like: 10.01, and throws exception:
Input string was not in a correct format.
The fix is easy: using en-US culture when do double.parse: double.Parse("10.01", new CultureInfo("en-US"));or set en-US culture as the current culture of current thread:
Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");
The workaround before we release the fix is to change the region and language settings to en_US for the user who starts the application.
Test Code
Update:
Today, we meet similar error, but this time is when C# sends a double string to java application: the region is actually de-AT. C# sent 0,2 to java servlet which is unable to parse it.
The solution is to convert to en-US: d.ToString(enUS)
Lesson Learned
When trouble shoot this problem in customser case, I noticed when I type some character, it is converted to other word, at that time, I should notice the customer is using a different language setting.
How to check Windows Region and Language Setting
Checking the Regional and Language Settings
Resources:
Java Locale “Finnish (Finland)” (fi-FI)
Using Language Identifiers (RFC 3066) - Region Code List
Our C# application sent a query to Solr server, and parsing the response. It works fine, until recently one of our customers hits one exception:
Exception Message [Input string was not in a correct format.]
System.Number.ParseDouble(String value, NumberStyles options, NumberFormatInfo numfmt)
at System.Double.Parse(String s, NumberStyles style)
The Root Cause
Check the language settings, the server machine is using Finnish:fi-FI.
The Solr response always uses en-US locale format for numbers, it uses "." period as decimal separator:
<double name="min">10.01</double>
But in fi-FI[Finnish(Finland)], it uses "," comma as decimal separator.
This would cause double.parse fail to parse the string like: 10.01, and throws exception:
Input string was not in a correct format.
The fix is easy: using en-US culture when do double.parse: double.Parse("10.01", new CultureInfo("en-US"));
The workaround before we release the fix is to change the region and language settings to en_US for the user who starts the application.
Test Code
using System.Globalization; using System.Threading; // Add it via "add reference" using Microsoft.VisualStudio.TestTools.UnitTesting; static void Main(string[] args) { CultureInfo originalCulture = Thread.CurrentThread.CurrentCulture; Console.WriteLine("Orignal Culture: " + originalCulture); CultureInfo enUS = CultureInfo.CreateSpecificCulture("en-US"); CultureInfo fiFi = CultureInfo.CreateSpecificCulture("fi-FI"); testParse(enUS, fiFi); testToString(enUS, fiFi); Console.ReadLine(); } private static void testToString(CultureInfo enUS, CultureInfo fiFi) { Thread.CurrentThread.CurrentCulture = fiFi; double d = 0.2; // output fi-FI format: 0,2 String str = d.ToString(); Console.WriteLine("fi-FI: " + d.ToString()); Assert.AreEqual("0,2", str); str = d.ToString(enUS); // output en-US format: 0.2 Console.WriteLine("fi-FI: " + str); Assert.AreEqual("0.2", str); } private static void testParse(CultureInfo enUS, CultureInfo fiFi) { Thread.CurrentThread.CurrentCulture = fiFi; // print 10,01 Console.WriteLine(10.01); double d1 = double.Parse("10,01"); // use en-US to parse, this works fine. double d2 = double.Parse("10.01", enUS); try { // the follwing code would cause exception: Input string was not in a correct format. double d3 = double.Parse("10.01"); Assert.Fail("should fail"); } catch (Exception e) { Console.WriteLine("expected ex: " + e); } // change culture to en-US Thread.CurrentThread.CurrentCulture = enUS; double d4 = double.Parse("10.01"); }
Update:
Today, we meet similar error, but this time is when C# sends a double string to java application: the region is actually de-AT. C# sent 0,2 to java servlet which is unable to parse it.
The solution is to convert to en-US: d.ToString(enUS)
Lesson Learned
When trouble shoot this problem in customser case, I noticed when I type some character, it is converted to other word, at that time, I should notice the customer is using a different language setting.
How to check Windows Region and Language Setting
Checking the Regional and Language Settings
Resources:
Java Locale “Finnish (Finland)” (fi-FI)
Using Language Identifiers (RFC 3066) - Region Code List