.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:

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

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

Внимание!

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

Я недавно столкнулся с этим, когда у пользователя были настройки его региона и языка на английском (США), но он выбрал свой формат даты для 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.