У меня есть строка текста, например, так:
var foo = "FooBar";
Я хочу объявить вторую строку с именем bar
и сделать ее равной первому и четвертому символу моего первого foo
, поэтому я делаю это так:
var bar = foo[0].ToString() + foo[3].ToString();
Это работает, как и ожидалось, но ReSharper советует мне заключить Culture.InvariantCulture
в скобки, так что эта строка заканчивается так:
var bar = foo[0].ToString(CultureInfo.InvariantCulture)
+ foo[3].ToString(CultureInfo.InvariantCulture);
Что это значит и повлияет ли это на работу моей программы?
Ответы:
Не все культуры используют один и тот же формат для дат и десятичных значений / значений валют.
Это важно для вас , когда вы преобразования входных значений (чтение) , которые хранятся в виде строки в
DateTime
,float
,double
илиdecimal
. Также будет иметь значение, если вы попытаетесь отформатировать вышеупомянутые типы данных в строки (запись) для отображения или хранения.Если вы знаете, в какой конкретной культуре будут ваши даты и десятичные значения / значения валют, вы можете использовать это конкретное
CultureInfo
свойство (то естьCultureInfo("en-GB")
). Например, если вы ожидаете ввода пользователя.Это
CultureInfo.InvariantCulture
свойство используется, если вы форматируете или анализируете строку, которая должна анализироваться программным обеспечением независимо от локальных настроек пользователя.По умолчанию используется значение
CultureInfo.InstalledUICulture
CultureInfo, которое зависит от настроек операционной системы. Вот почему вы всегда должны следить за тем, чтобы информация о культуре соответствовала вашим намерениям (см . Ответ Мартина для хорошего руководства).источник
en-US
. Это местная культура. ИInvariantCulture
используется, когда вы хотите форматирование, не зависящее от культуры, которое не зависит от локальной системы. Например, при работе с текстовыми форматами файлов.Когда числа, даты и время форматируются в строки или анализируются из строк, для определения того, как это делается, используется культура. Например, в доминирующей
en-US
культуре у вас есть эти строковые представления:В моей культуре (
da-DK
) значения имеют строковое представление:В операционной системе Windows пользователь может даже настроить форматирование чисел и даты / времени, а также выбрать другую культуру, отличную от культуры его операционной системы. Используемое форматирование - выбор пользователя, каким он должен быть.
Таким образом , при форматировании значения , которое будет отображаться пользователю , используя, например ,
ToString
илиString.Format
или разобрано из строки , используяDateTime.Parse
илиDecimal.Parse
по умолчанию использоватьCultureInfo.CurrentCulture
. Это позволяет пользователю контролировать форматирование.Тем не менее, большая часть форматирования и синтаксического анализа строк - это на самом деле не строки, которыми обмениваются приложение и пользователь, а между приложением и некоторым форматом данных (например, файлом XML или CSV). В этом случае вы не хотите использовать,
CultureInfo.CurrentCulture
потому что, если форматирование и синтаксический анализ выполняются с разными культурами, он может сломаться. В этом случае вы хотите использоватьCultureInfo.InvariantCulture
(который основан наen-US
культуре). Это гарантирует, что значения могут идти в обе стороны без проблем.Причина , по которой ReSharper дает предупреждение, что некоторые авторы приложения не знает об этом различии , которое может привести к нежелательным результатам , но они никогда не обнаружить это , потому что их
CultureInfo.CurrentCulture
IS ,en-US
который имеет такое же поведение , какCultureInfo.InvariantCulture
. Тем не менее, как только приложение используется в другой культуре, где существует вероятность использования одной культуры для форматирования, а другой для анализа приложения, может произойти сбой.Итак, подведем итог:
CultureInfo.CurrentCulture
(по умолчанию), если вы форматируете или анализируете строку пользователя.CultureInfo.InvariantCulture
если вы форматируете или анализируете строку, которая должна быть проанализирована программным обеспечением.источник
Decimal
переменная, содержащая определенное значение в долларах США, хочу ли я сделать исключение и использовать егоen-US
при отображении, чтобы убедиться, что я не получаю результат, похожий на число в евро? Я пыталсяCultureInfo.InvariantCulture
, но получил это для маркера валюты¤
, так что я не уверен, что это правильный путь.CultureInfo.CurrentCulture
). Если вам, помимо отображения числа, нужна валюта, то, возможно, вам следует делать это согласованным образом, то есть не использовать a,CultureInfo
а вместо этого использовать трехбуквенный код валюты, напримерUSD 1,234.56
. Тогда вы не будете сталкиваться с проблемами сопоставления валюты с культурой.По словам Microsoft:
(с http://msdn.microsoft.com/en-us/library/4c5zdc6a(vs.71).aspx )
Таким образом, InvariantCulture похож на культуру "en-US", но не совсем то же самое. Если вы напишите:
тогда s1 и s2 будут иметь формат similair, но InvariantCulture добавляет ведущие нули, а «en-US» использует AM или PM.
Таким образом, InvariantCulture лучше использовать для внутреннего использования, когда вы, например, сохраняете дату в текстовый файл или анализируете данные. И указанное CultureInfo лучше, когда вы предоставляете данные (дата, валюта ...) конечному пользователю.
источник
Для таких вещей, как числа (десятичные точки, запятые в количествах), они обычно предпочитаются в конкретной культуре.
Подходящий способ сделать это можно установить на уровне культуры (для немецкого языка) следующим образом:
источник
JetBrains предлагает разумное объяснение ,
но если я работаю над сайтом, который, как я знаю, будет только на английском, я просто проигнорирую это предложение.
источник