Как заставить C # писать английский (нелокализованный) числовой формат по умолчанию? - PullRequest
1 голос
/ 25 октября 2010

Я использую английскую Visual Studio 2008 на английском Windows 7, но я нахожусь в Нидерландах. Многие мои программы должны читать и записывать числа с плавающей запятой. По сравнению с английским языком нотация чисел на голландском языке меняет значение точек и запятых (т. Е. 1,00 на нидерландском языке означает тысячу и один, а 1,001 - 1 + 1/1000). Мне никогда не придется писать (или читать) числа в голландском формате, но по какой-то причине каждая программа, которую я компилирую, использует ее по умолчанию, поэтому каждая ToString () неверна. Это получает меня каждый раз. Я знаю, что могу поставить это в начале каждой темы:

System.Threading.Thread.CurrentThread.CurrentCulture = System.Globalization.CultureInfo.CreateSpecificCulture("en-US");

Или замените каждый экземпляр ToString () на:

String.Format(CultureInfo.InvariantCulture, "{0:0.####},{1:0.####}", x)

Но иногда я просто хочу что-то скомпилировать, чтобы посмотреть, как это работает, и не вносить никаких изменений. Кроме того, я обязательно забуду об этом иногда. Разве нельзя просто сказать C #, .NET и / или Visual Studio, чтобы все мои проекты / программы всегда использовали английский формат чисел?

Ответы [ 3 ]

5 голосов
/ 25 октября 2010

Дело не в компиляции, а в том, что происходит во время исполнения . Если вы явно не укажете культуру, будет использоваться текущая культура (во время выполнения). Я не знаю способа изменить это поведение, которое оставляет вам варианты:

  • Явно указав культуру для использования
  • Явное изменение текущей культуры

Обратите внимание, что даже если вы измените текущую культуру потока current , это может не повлиять на такие вещи, как пул потоков. Лично я думаю, что лучше всегда использовать культуру в явном виде.

Вы всегда можете написать свои собственные методы расширения для (скажем) вызова исходной версии, но с передачей в CultureInfo.InvariantCulture. Например:

public static string ToInvariantString(this IFormattable source, string format)
{
    return source.Format(format, CultureInfo.InvariantCulture);
}

Получение этого права везде может быть болью, по общему признанию ... и чтобы избежать бокса, вы бы на самом деле хотели немного другую подпись:

public static string ToInvariantString<T>(this T source, string format)
    where T : IFormattable
{
    return source.Format(format, CultureInfo.InvariantCulture);
}
1 голос
/ 25 октября 2010

Вы можете добавить строку, которая устанавливает CurrentCulture в Program.cs в шаблонах вашего проекта.

0 голосов
/ 25 октября 2010

Попробуйте: Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture;

...