Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

CultureInfo.InvariantCulture in .ToString()

I am currently fixing FxCop issues so I encountered issue where I have to provide cultureinfo when converting a string using ToString() .

Currently in my code nothing we are passing as IFormatProvider so I have read some msdn articles saying that when you don't pass any value for cultureinfo it will assign a default value and when you specify CultureInfo as InvariantCulture it will be independent of any culture.

My question is, "Are default and CultureInfo.InvariantCulture one and the same? Can I replace all my code from default to InvariantCulture?"

Ex :

 int st = 123;
 String s = st.ToString(123); // this will be taken as default 
 String s = st.ToString(123, CultureInfo.InvariantCulture); // culture is specified externally 

Are the second and third lines equivalent?

like image 463
user3766691 Avatar asked Jun 23 '14 08:06

user3766691


People also ask

What does CultureInfo Invariantculture mean?

The invariant culture is culture-insensitive; it is associated with the English language but not with any country/region. You specify the invariant culture by name by using an empty string ("") in the call to a CultureInfo instantiation method. CultureInfo.

What is CultureInfo C#?

CultureInfo provides information about a specific culture. The information includes the names for the culture, the writing system, the calendar used, the sort order of strings, and formatting for dates and numbers.


2 Answers

Is default and CultureInfo.InvariantCulture are one and the same?

No, absolutely not. The default culture depends (initially) on the operating system settings. The invariant culture is meant to be a "neutral" culture.

Your example of 123 isn't a great one, because most (all?) cultures will represent integers the same way - at least until you get into formats with grouping separators etc. (I don't think .NET supports non-Arabic numerals when formatting integers.)

Compare that with formatting a decimal value, for example:

decimal x = 123.45m;
Console.WriteLine(x.ToString()); // Might be 123,45
Console.WriteLine(x.ToString(CultureInfo.InvariantCulture)); // Always 123.45

If you run the above code in (say) France, the default culture will be French, which uses a comma as a decimal separator - so it will print out "123,45".

The rule of thumb to remember is that the invariant culture is suitable for machine-to-machine communications (e.g. formatting values in JSON or XML) whereas other cultures are more suitable for displaying information directly to users.

Although the default culture is originally based on the operating system settings, it can be changed using Thread.CurrentCulture and Thread.CurrentUICulture; the latter is used for looking up translated resources, whereas the former is used for formatting decisions like the above. You can set these properties on any thread, but typically you'd use Thread.CurrentThread.CurrentCulture = ...

like image 147
Jon Skeet Avatar answered Oct 05 '22 07:10

Jon Skeet


No, they are not the same.

The first will take the regional settings from the computer or the culture settings from the application thread running.

The second one will take the English language, according to MSDN:

The invariant culture is culture-insensitive; it is associated with the English language but not with any country/region.

like image 39
Patrick Hofman Avatar answered Oct 05 '22 06:10

Patrick Hofman