Как установить значение CultureInfo.InvariantCulture?

Когда у меня есть такая часть кода в С#:

double a = 0.003;
Console.WriteLine(a);

Он печатает "0,003".

Если у меня есть еще один фрагмент кода:

double a = 0.003;
Console.WriteLine(a.ToString(CultureInfo.InvariantCulture));

Он печатает "0.003".

Моя проблема в том, что мне нужна точка в виде десятичной метки, но С# делает запятую по умолчанию. Кроме того, я не хочу набирать такую ​​длинную строку кода только для распечатки двойной переменной.

Ответы

Ответ 1

Вы можете настроить культуру текущего потока на любую желаемую культуру:

Thread.CurrentThread.CurrentCulture = System.Globalization.CultureInfo.InvariantCulture;

Обратите внимание, что изменение культуры также влияет на такие вещи, как сравнение строк и сортировка, форматы дат и парсинг дат и цифр.

Ответ 2

1 Пустая строка указывает InvariantCulture в config.file

По умолчанию для культуры и UICulture установлено значение "" в конфигурации.

   <system.web>
      <globalization culture="" />
   </system.web>

2 Вы также можете определить на Thread

Ответ 3

Начиная с версии .NET Framework 4.5 и .NET Core/Standard 1.0 вы можете изменить культуру для всего приложения, а не только для текущего потока, изменив свойства CultureInfo.DefaultThreadCurrentCulture и CultureInfo.DefaultThreadCurrentUICulture:

CultureInfo.DefaultThreadCurrentCulture = CultureInfo.InvariantCulture;
CultureInfo.DefaultThreadCurrentUICulture = CultureInfo.InvariantCulture;

Ответ 4

С# по умолчанию не делает его запятой, это ваша культура. Попробуйте установить культуру явно,

System.Threading.Thread.CurrentThread.CurrentCulture = new CultureInfo("de-DE");

Ссылка: http://msdn.microsoft.com/en-us/library/ms425914(v=office.12).aspx

Ответ 5

Если вы никогда не хотите форматирования чисел и дат для конкретных культур, вы можете установить культуру один раз, возможно, при запуске приложения.

Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture

Если это приложение ASP.NET, более простой альтернативой является установка культуры в элементе конфигурации <globalization> в файле web.config.

В противном случае у вас нет большой альтернативы прямому указанию культуры. Если вы обнаруживаете, что повторяете ввод одной и той же длинной строки кода, делайте то, что вы всегда делаете в этом случае: оберните ее в метод.

Ответ 6

Когда вы вызываете WriteLine() и даете в double, он делает внутренне более или менее этот вызов:

Console.WriteLine(a.ToString(CultureInfo.CurrentCulture));

Теперь задача должна заменить CurrentCulture на InvariantCulture. Это можно сделать с помощью следующей строки кода:

Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture;

Теперь вы используете поток InvariantCulture, и ваш первый вызов также должен печатать "0.003".

Ответ 7

Вы можете установить CultureInfo.InvariantCulture по умолчанию, как показано выше, @Guffa и другими.

Но у вас должно быть четкое представление, почему вы это делаете. Это будет нормально, если вы выполняете операции экспорта/импорта данных, но, вероятно, вы не будете использовать его для строк, представленных пользователю.

В документации Microsoft указано:

Инвариантная культура нечувствительна к культуре; это связано с английский язык, но не в какой-либо стране/регионе. Вы указываете инвариантной культуры по имени, используя пустую строку ("") в вызове метод экземпляра CultureInfo....

В отличие от данных, чувствительных к культуре, который может быть изменен путем пользовательской настройки или обновлениями .NET Framework или операционной системы данные инвариантной культуры стабильной с течением времени и между установленными культурами и не может быть настроенных пользователями. Это делает инвариантную культуру особенно полезно для операций, которые требуют результатов, не зависящих от культуры, таких как операции форматирования и разбора, которые сохраняют форматированные данные, или сортировки и упорядочения, которые требуют, чтобы данные отображались в фиксированный порядок независимо от культуры.