Глобально меняющийся формат отрицательных номеров валют в C # - PullRequest
17 голосов
/ 22 октября 2010

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

Ответы [ 2 ]

11 голосов
/ 22 октября 2010

Алиостад был близок ... попробуйте это в вашем базовом контроллере:

        System.Globalization.CultureInfo modCulture = new System.Globalization.CultureInfo("en-US");
        modCulture.NumberFormat.CurrencyNegativePattern = 1;
        Thread.CurrentThread.CurrentCulture = modCulture;
4 голосов
/ 22 октября 2010

Вы на правильном пути. Но вместо создания нового форматера измените отрицательный формат текущего потока:

  // 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"));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...