.NET: Есть ли различия между InvariantCulture и en-US? - PullRequest
25 голосов
/ 24 февраля 2010

Учитывая следующие две культуры:

CultureInfo c1 = InvariantCulture;
CultureInfo c2 = new CultureInfo("en-US");

и я должен был изучить каждую информацию, относящуюся к обеим культурам, например ::10000

c1.DateTimeInfo.ShortDatePattern;
c2.DateTimeInfo.ShortDatePattern;

c1.DateTimeInfo.LongDatePattern;
c2.DateTimeInfo.LongDatePattern;

c1.NumberFormat.CurrencyDecimalDigits;
c2.NumberFormat.CurrencyDecimalDigits;

c1.TextInfo.IsRightToLeft;
c2.TextInfo.IsRightToLeft;

Могу ли я найти какие-либо различия?

Другими словами, идентична ли InvariantCulture для всех целей культуре "en-US"?

Ответы [ 6 ]

32 голосов
/ 24 февраля 2010

Да.

Например: InvariantCulture использует международный символ для валюты: «¤» против знака доллара: «$» при форматировании валюты.

Однако по большей части они очень похожи.

Редактировать : Список различий между en-US и Invariant:

                          en-US                        Invariant
=====================     ==================           ==================
Number                    123456.78                    +123456.78
Currency Symbol           $                            ¤
Currency                  $123456.78                   ¤123456.78
Short Date                1/11/2012                    01/11/2012
Time                      10:36:52 PM                  22:36:52
Metric                    No                           Yes
Long Date                 Wednesday, January 11, 2012  Wednesday, 11 January, 2012
Year Month                January, 2012                2012 January
4 голосов
/ 24 февраля 2010

Существуют некоторые фактические различия (проверьте оба значения в окне «Просмотр»), но наиболее значимая разница - intent . InvariantCulture показывает ваше намерение проанализировать некоторые данные независимо от культуры, если это связано с английским языком, тогда как en-US заявляет о вашем фактическом намерении проанализировать данные специфическим для США способом.

3 голосов
/ 24 февраля 2010

Хорошо, если вы посмотрите на то, что может выдать ваш фрагмент кода:

CultureInfo c1 = CultureInfo.InvariantCulture;
CultureInfo c2 = new CultureInfo("en-US");

Console.WriteLine( c1.DateTimeFormat.ShortDatePattern.ToString());
Console.WriteLine( c2.DateTimeFormat.ShortDatePattern.ToString());

Console.WriteLine( c1.DateTimeFormat.LongDatePattern.ToString());
Console.WriteLine( c2.DateTimeFormat.LongDatePattern.ToString());

Console.WriteLine( c1.NumberFormat.CurrencyDecimalDigits.ToString());
Console.WriteLine( c2.NumberFormat.CurrencyDecimalDigits.ToString());

Console.WriteLine( c1.TextInfo.IsRightToLeft.ToString());
Console.WriteLine( c2.TextInfo.IsRightToLeft.ToString());

Вы увидите некоторые отличия:

MM/dd/yyyy
M/d/yyyy
dddd, dd MMMM yyyy
dddd, MMMM dd, yyyy
2
2
False
False

И просто подумайте, когда США теряют свою опору и решают начать использовать даты в европейском стиле или переходят на метрическую систему (метрическая система - это инструмент дьявола! Моя машина получает сорок удочек до головы, и вот так Мне нравится!), InvariantCulture может просто спокойно и плавно оставаться такой, какая она есть. Так что все эти даты, которые вы спрятали в базе данных в текстовом виде с помощью InvariantCulture, будут продолжать работать ...

1 голос
/ 11 января 2012

Очень важно учитывать назначение данных. Если вы сериализуете, обязательно используйте InvariantCulture.

См .: http://msdn.microsoft.com/en-us/library/system.globalization.cultureinfo.aspx

Из документации Microsoft:

Данные динамической культуры

За исключением инвариантной культуры, данные культуры являются динамическими . Это верно даже для предопределенных культур. ...

Внимание

При сохранении данных ваше приложение должно использовать инвариантную культуру , используйте двоичный формат или используйте определенный независимый от культуры формат. Данные сохраняются в соответствии с текущими значениями, связанными с особая культура, кроме инвариантной культуры, может стать не читается или может изменить смысл, если эта культура изменится.

Я только что столкнулся с этим недавно, когда у пользователя были установлены его настройки «Регион и язык» на английский (США), но он выбрал свой персональный формат даты - «dd-MMM-yy». Он получил проект от клиента с датой в стандартном формате en-US "29.04.2010 13:45:30" и кодом:

customValue = DateTime.Parse (customValue.ToString (), CultureInfo.CreateSpecificCulture ( "EN-US"));

вызвал исключение, потому что его локальные предпочтения переопределяют типичный формат en-US.

1 голос
/ 24 февраля 2010

Краткий ответ да. InvariantCulture - это то, что говорится, а не конкретная культура. Это английский, но не конкретный регион

Подробнее об этом можно прочитать здесь: MSDN

0 голосов
/ 24 февраля 2010

Я знаю, что у них разные CultureName и LCID (см. этот список ).

Кроме того, символы валюты отличаются - Inv для InvariantCulture и $ для en-US.

С InvariantCulture:

It is used in almost any method in the Globalization namespace that requires a culture.

Предполагая, что по большей части они взаимозаменяемы. Однако в именах указано намерение, поэтому вы должны подумать об этом при использовании CultureInfo.

...