Как установить CultureInfo.Инвариантная культура по умолчанию?
когда у меня есть такой кусок кода в C#:
double a = 0.003;
Console.WriteLine(a);
он печатает "0,003".
Если у меня есть еще один кусок кода:
double a = 0.003;
Console.WriteLine(a.ToString(CultureInfo.InvariantCulture));
он печатает "0.003".
моя проблема в том, что мне нужна точка как десятичная метка, но C# делает запятую по умолчанию. Кроме того, я не хочу вводить такую длинную строку кода только для печати двойной переменной.
7 ответов
вы можете установить культуру текущего потока в любую культуру, которую вы хотите:
Thread.CurrentThread.CurrentCulture = System.Globalization.CultureInfo.InvariantCulture;
обратите внимание, что изменение культуры также влияет на такие вещи, как сравнение и сортировка строк, форматы дат и синтаксический анализ дат и чисел.
1 пустая строка задает инвариантную культуру в config.file
по умолчанию, Культура и UICulture установлены в "" в конфигурации.
<system.web>
<globalization culture="" />
</system.web>
2 вы также можете определить на вашем Thread
C# не делает его запятой по умолчанию,это ваша культура. Попробуйте установить культуру эксплицитно,
System.Threading.Thread.CurrentThread.CurrentCulture = new CultureInfo("de-DE");
ссылка:http://msdn.microsoft.com/en-us/library/ms425914 (v=офис.12).aspx
Если вы никогда хотите, чтобы форматирование чисел и дат зависело от культуры, вы можете установить культуру один раз, возможно, при запуске приложения .
Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture
Если это ASP.NET применение, более простой альтернативой является установка культуры в <globalization>
элемент конфигурации web.конфиг.
в противном случае у вас нет альтернативы, явно указывая культуры. Если вы обнаружите, что повторяете одну и ту же длинную строку кода, сделайте то, что вы всегда делать в этом случае: оберните его в метод.
когда вы называете WriteLine()
и дать в двойном он делает внутренне более или менее этот вызов:
Console.WriteLine(a.ToString(CultureInfo.CurrentCulture));
задача будет теперь заменить CurrentCulture
С InvariantCulture
. Это можно сделать с помощью следующей строки кода:
Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture;
теперь you'R thread устанавливается инвариантной культурой, и ваш первый вызов также должен печатать "0.003".
вы можете установить CultureInfo.InvariantCulture
по умолчанию, как показано выше @Guffa и другие.
но вы должны иметь четкое представление, почему вы делаете это. Это будет нормально, если вы выполняете операции экспорта/импорта данных, но, вероятно, вы не будете использовать его для строк, представленных пользователю.
в документации Microsoft говорится:
инвариантная культура нечувствительна к культуре; она связана с английский язык, но не с какой-либо страной/регионом. Вы укажите инвариантная культура по имени с помощью пустой строки ( "" ) в вызове метод создания экземпляра CultureInfo. ...
В отличие от данных, чувствительных к культуре, который может быть изменен пользовательской настройкой или обновлениями .Net или операционной системы, инвариантных культура стабильна во времени и между установленными культурами и не может быть подгонянный потребителями. Это делает инвариантную культуру особенно полезно для операций, требующих независимости от культуры результаты такие как операции форматирования и синтаксического анализа, сохраняющие форматированные данные, или операции сортировки и упорядочения, требующие отображения данных в фиксированный порядок вне зависимости от культуры.
начиная с .NET Framework версии 4.5 (и .NET Core / Standard 1.0) вы можете изменить культуру для всего домена приложения, а не только для текущего потока, изменив CultureInfo.DefaultThreadCurrentCulture и CultureInfo.DefaultThreadCurrentUICulture свойства:
CultureInfo.DefaultThreadCurrentCulture = CultureInfo.InvariantCulture;
CultureInfo.DefaultThreadCurrentUICulture = CultureInfo.InvariantCulture;