Někdy v .NET potřebujeme formátovat nebo naopak parsovat řetězec ve specifické kultuře, k tomu potřebujeme získat objekt CultureInfo této konkrétní kultury. Možností jak vytvořit objekt CultureInfo je více, proto si ukážeme rozdíly mezi nimi.
Předpokládejme následující jednoduchý příklad. Ve Windows si u české kultury změníme znak oddělovače desetinné části u čísel, provedeme to v Control Panel v dialogu Region and Language (nebo Region na Windows 8) volbou Additional settings pro českou kulturu. Změníme položku Decimal symbol například na znak |.
A spustíme tento jednoduchý C# kód:
var culture = System.Globalization.CultureInfo.CreateSpecificCulture("cs-CZ");
System.Diagnostics.Debug.WriteLine(culture.NumberFormat.NumberDecimalSeparator);
culture = System.Globalization.CultureInfo.GetCultureInfo("cs-CZ");
System.Diagnostics.Debug.WriteLine(culture.NumberFormat.NumberDecimalSeparator);
culture = new System.Globalization.CultureInfo("cs-CZ");
System.Diagnostics.Debug.WriteLine(culture.NumberFormat.NumberDecimalSeparator);
culture = new System.Globalization.CultureInfo("cs-CZ", false);
System.Diagnostics.Debug.WriteLine(culture.NumberFormat.NumberDecimalSeparator);
Výstup je následující:
|
,
|
,
Z výsledků je patrné, že v případě metody CreateSpecificCulture (*) získáme kulturu změněnou podle aktuálního uživatelského nastavení ve Windows. V případě metody GetCultureInfo naopak dostaneme výchozí nastavení kultury (tj. původní znak desetinné čárky ‘,’). V případě použití konstruktoru můžeme toto chování ovlivnit parametrem useUserOverride, pozor ale, že výchozí je hodnota true.
Pokud tedy potřebujete v kódu získat specifickou kulturu, např. pro parsování hodnot při importu souboru, jehož formát je pevně daný, musíme použít GetCultureInfo nebo uvést useUserOverride false, aby kód nebyl závislí na změnách v nastavení kultury ve Windows.
(*) Metoda CreateSpecificCulture také na rozdíl od ostatních způsobů vrací vždy specifickou kulturu i při volání pouze s názvem neutrální kultury (například “cs”).