Как установить значение 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 или операционной системы данные инвариантной культуры стабильной с течением времени и между установленными культурами и не может быть настроенных пользователями. Это делает инвариантную культуру особенно полезно для операций, которые требуют результатов, не зависящих от культуры, таких как операции форматирования и разбора, которые сохраняют форматированные данные, или сортировки и упорядочения, которые требуют, чтобы данные отображались в фиксированный порядок независимо от культуры.