.NET: Существуют ли какие-либо различия между InvariantCulture и en-US?

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

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

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

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 ответов

Да.

Например: 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


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


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

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

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


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

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


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

Смотрите: http://msdn.microsoft.com/en-us/library/system.globalization.cultureinfo.aspx

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

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

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

Внимание!

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

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

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

выбрал исключение, потому что его локальные предпочтения переопределяют типичный формат в США.


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

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

От InvariantCulture:

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

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

licensed under cc by-sa 3.0 with attribution.