Подтвердить что ты не робот

Глобально изменяющийся формат отрицательных номеров валют в С#

У нас есть большой проект 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" )... есть ли лучший способ? Моя первая мысль состояла в том, чтобы просто изменить наш язык в Австралии, но понял, что форматирование даты будет испорчено.

4b9b3361

Ответ 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"));