Я бы попытался дать более проницательный ответ, чем , этот .
CurrentCulture следует использовать для форматирования.То есть числа, валюты, проценты, даты и время должны всегда быть отформатированы с этой культурой, прежде чем отобразится для пользователя .Вот несколько примеров:
const string CURRENCY_FORMAT = "c";
const string PERCENTAGE_FORMAT = "p";
DateTime now = DateTime.UtcNow; // all dates should be kept in UTC internally
// convert time to local and format appropriately for end user
dateLabel.Text = now.ToLocalTime().ToString(CultureInfo.CurrentCulture);
float someFloat = 12.3456f;
// yields 12,3456 for pl-PL Culture
floatLabel.Text = someFloat.ToString(CultureInfo.CurrentCulture);
// yields 12,35 zł for pl-PL Culture - rounding takes place!
currencyLabel.Text = someFloat.ToString(CURRENCY_FORMAT, CultureInfo.CurrentCulture);
// yields 1234,56% for pl-PL Culture - 1.0f is 100%
percentageLabel.Text = someFloat.ToString(PERCENTAGE_FORMAT, CultureInfo.CurrentCulture);
Важно отметить, что вы никогда не должны использовать float
или double
для хранения информации, связанной с валютой, в первую очередь (decimal
- правильный выбор).
Другим распространенным вариантом использования CurrentCulture
является анализ с учетом локали.Ваша заявка должна всегда позволять пользователям вводить данные в своем региональном формате:
float parsedFloat;
if (float.TryParse(inputBox.Text, NumberStyles.Float, CultureInfo.CurrentCulture, out parsedFloat))
{
MessageBox.Show(parsedFloat.ToString(CultureInfo.CurrentCulture), "Success at last!");
}
Обратите внимание, что я всегда предоставляю параметр IFormatProvider
, хотя он подразумевается и считается CultureInfo.CurrentCulture
.Причина в том, что я хочу общаться с коллегами-разработчиками: это то, что будет отображаться для конечных пользователей.Это одна из причин, почему FxCop рассматривает пропуск этого параметра как ошибку.
InvariantCulture , с другой стороны, должен использоваться для надежного преобразования одного из упомянутых выше классов в его текстовыйпредставление.Поэтому, если вы хотите, например, передать DateTime
, float
, double
или подобный объект по сети, сохранить его в базе данных или в каком-либо текстовом файле (включая XML), вы должны всегда использоватьInvariantCulture
:
float someFloat = 1234.56f;
// yields 1234.56
string internalFloat = someFloat.ToString(CultureInfo.InvariantCulture);
DateTime now = DateTime.UtcNow;
// yields something like 04/16/2011 19:02:46
string internalDateAndTime = now.ToString(CultureInfo.InvariantCulture);
Здесь следует отметить, что формат даты / времени, предлагаемый InvariantCulture
, фактически совпадает с форматом en-US.Хотя это надежно, это не совсем правильно.Что действительно нужно использовать, так это ISO8601 сменный формат даты и времени .По какой-то причине Microsoft даже не предоставляет такой шаблон (наиболее близкими являются шаблон Sortable - "s" и универсальный шаблон - "u", который напоминает только формат ISO8601), вам необходимо создать свой собственный файл, подобный этому:
const string iso8601Pattern = "yyyy-MM-dd'T'HH:mm:ss'Z'";
string iso8601Formatted = now.ToString(iso8601Pattern);
Весьма важное примечание: IFormatProvider
на самом деле требуется здесь, так как пропуск этого параметра может привести к серьезным ошибкам.Однажды мне пришлось исправить дефект на французской ОС.Код был таким:
<del><code>float dbVersion = // some kind of logic that took float from database
string versionString = dbVersion.ToString(); // culture-aware formatting used
Version ver = new Version(versionString); // exception thrown here
</code></del>
Причина была очень простой: форматирование с плавающей точкой во французской ОС (с французским региональным форматированием) было отформатировано примерно как 10,5, а класс Version
требует ввода, инвариантного к культуре.
CurrentUICulture отвечает за загрузку соответствующих переводимых ресурсов для вашего приложения.То есть его следует использовать для отображения правильных текстовых сообщений, цветов и изображений.
В приложении Asp.Net, если вы хотите по какой-то причине реализовать механизм локализации CSS (возможность переопределять определения CSS для каждого языка), CurrentUICulture
- этохороший путь (при условии, что вы действительно читаете это свойство из веб-браузера).
Аналогично, если вы хотите реализовать механизм переключения языка, CurrentUICulture
- это тот, который должен быть переопределен.
InstalledUICulture связан со стандартным языком интерфейса операционной системы ОС.Как MSDN говорит:
Это свойство эквивалентно GetSystemDefaultUILanguage в Windows API.
Чтобы понять, что это свойство, нам нужнокопаться в какой-то теории.Существуют различные линейки продуктов Windows:
- один язык (т. Е. Английский, французский, немецкий, японский и т. Д.)
- MUI (то есть многоязычный пользовательский интерфейс - базовая английская ОС и языкPacks)
Для одноязычных продуктовых линеек InstalledUICulture всегда будет возвращать язык операционной системы, тогда как для MUI он всегда должен возвращать английский (США), то есть en-US.Это полезно?Я не знаю, мне никогда не нужна была такая информация.И лично я не видел программу, которая использовала бы это свойство.