C # создание собственного NumberFormatInfo для отображения «Свободно», когда значение валюты составляет $ 0,00 - PullRequest
4 голосов
/ 05 октября 2010

Мне нужно отобразить валюту в моем приложении ASP.NET MVC, но когда валюта равна 0, я бы хотел, чтобы она отображала «Свободно» (локализовано, конечно!) Вместо $ 0,00.

Так что, когда у меня что-то подобное ...

Decimal priceFree = 0.00;
Decimal priceNotFree = 100.00;

priceFree.ToString("C");
priceNotFree.ToString("C");

Выход «$ 0,00» "$ 100,00"

Я бы хотел, чтобы это было "Свободно" "$ 100,00"

Я полагаю, что для этого можно использовать метод .ToString (формат строки, IFormatProvider formatProvider), но я не уверен, как это сделать. Очевидно, я хочу повторно использовать как можно большую часть NumberFormatInfo и переопределять его только при вводе 0. В этом случае я могу просто вернуть локализованный ресурс, содержащий мою «свободную» строку.

Так как мне это сделать?

Спасибо

Ответы [ 4 ]

16 голосов
/ 05 октября 2010

Используйте

.ToString("$###.00;;Free")
4 голосов
/ 05 октября 2010

Я думаю, что самый простой способ - это метод расширения:

public static string ToPriceString(this decimal value) 
{
    if (value <= 0m) 
        return "Free"; // Your localized resource
    else 
        return value.ToString("C");
}

Если вы хотите использовать IFormatProvider, , есть хороший пример для MSDN .

2 голосов
/ 05 октября 2010

Как насчет метода расширения:

public static string FreeString(this decimal dec)
{
   if(dec == 0M)
   {
      return "Free";
   }
   else
   {
      return dec.ToString("C");
   }
}

Тогда

priceFree.FreeString();
priceNotFree.FreeString();
0 голосов
/ 05 октября 2010

Вместо того, чтобы использовать пользовательский IFormatProvider и передавать его каждый раз, как об этом:

 public static class MyFormatter
    {
        public static string ToFreeString(this decimal d)
        {
            return d == 0 ? "Free" : d.ToString("d");
        }
    }
...