Глобально изменяющийся формат отрицательных номеров валют в С#
У нас есть большой проект ASP.NET MVC, где все числа, выводимые на экран, форматируются как валюта (то есть ToString ( "c" ). Однако отрицательные числа отображаются с(). Например:
decimal d = -8.88m;
Console.WriteLine(d.ToString("c"));
//outputs $(8.88)
Это немного раздражает наших пользователей, особенно потому, что есть текстовые поля. У нас есть несколько тысяч мест, где мы отправляем валютные поля на экран, как это, поэтому нам понравится способ изменить форматирование по всему миру. Есть ли это? Все методы, которые я видел, показывают, что вам нужно создать новый форматтер, похожий на это:
string curCulture = System.Threading.Thread.CurrentThread.CurrentCulture.ToString();
System.Globalization.NumberFormatInfo currencyFormat =
new System.Globalization.CultureInfo(curCulture).NumberFormat;
currencyFormat.CurrencyNegativePattern = 1;
Мы бы предпочли не изменять все наши методы ToString ( "c" )... есть ли лучший способ? Моя первая мысль состояла в том, чтобы просто изменить наш язык в Австралии, но понял, что форматирование даты будет испорчено.
Ответы
Ответ 1
Aliostad был близок... попробуйте это в своем базовом контроллере:
System.Globalization.CultureInfo modCulture = new System.Globalization.CultureInfo("en-US");
modCulture.NumberFormat.CurrencyNegativePattern = 1;
Thread.CurrentThread.CurrentCulture = modCulture;
Ответ 2
Вы на правильном пути. Но вместо создания нового форматирования измените текущий отрицательный формат потока:
// update: dont use this!
Thread.CurrentThread.CurrentCulture.NumberFormat.CurrencyNegativePattern = 1;
Вы можете поместить это, когда запрос инициирован, и в ASP.NET отвечает за обработку запроса одним и только одним потоком, поэтому это повлияет на все ваши валютные формы (если вы сами не создадите новый поток, в этом случае у вас есть возможность изменить его).
Обновление
Да выше не работает, потому что он доступен только для чтения! попробуйте следующее:
Console.WriteLine((-111.98).ToString("c"));
CultureInfo currentCulture = Thread.CurrentThread.CurrentCulture;
CultureInfo newCulture = new CultureInfo(currentCulture.IetfLanguageTag);
newCulture.NumberFormat.CurrencyNegativePattern = 1;
Thread.CurrentThread.CurrentCulture = newCulture;
Console.WriteLine((-111.98).ToString("c"));