C# создание собственного NumberFormatInfo для отображения "Свободно", когда значение валюты составляет $0,00

Мне нужно отобразить валюту в моем приложении 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 ответа

Решение

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

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

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

Использование

.ToString("$###.00;;Free")

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

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

затем

priceFree.FreeString();
priceNotFree.FreeString();

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

 public static class MyFormatter
    {
        public static string ToFreeString(this decimal d)
        {
            return d == 0 ? "Free" : d.ToString("d");
        }
    }
Другие вопросы по тегам