Как установить 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;