C# C“创建要显示的自定义数字格式”;“免费”;当货币值为$0.00时

C# C“创建要显示的自定义数字格式”;“免费”;当货币值为$0.00时,c#,.net,currency,tostring,iformatprovider,C#,.net,Currency,Tostring,Iformatprovider,我需要在我的ASP.NET MVC应用程序中显示一种货币,但当货币为0时,我希望它显示“Free”(当然是本地化的!),而不是$0.00 所以当我有这样的事情 Decimal priceFree = 0.00; Decimal priceNotFree = 100.00; priceFree.ToString("C"); priceNotFree.ToString("C"); 输出是 "$0.00" “$100.00” 我希望是这样 “免费” “$100.00” 我想我可以使用.ToStri

我需要在我的ASP.NET MVC应用程序中显示一种货币,但当货币为0时,我希望它显示“Free”(当然是本地化的!),而不是$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时重写它。在这种情况下,我可以简单地返回包含“Free”字符串的本地化资源

那我该怎么做呢


谢谢

扩展方法如何:

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


我认为最简单的方法是扩展方法:

public static string FreeString(this decimal dec)
{
   if(dec == 0M)
   {
      return "Free";
   }
   else
   {
      return dec.ToString("C");
   }
}
public static string ToPriceString(this decimal value) 
{
    if (value <= 0m) 
        return "Free"; // Your localized resource
    else 
        return value.ToString("C");
}
公共静态字符串ToPriceString(此十进制值)
{

如果(value,而不是使用自定义的IFormatProvider并每次传递它,那么这样如何:

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


我建议引入Money/Currency类,而不是传递小数。这将使您更容易做到这一点,因为货币比小数有更多的含义。+1,很好。对于以前没有见过这个的任何人:[“;”部分分隔符]()。似乎很有趣。你能提供一个参考资料,或者更详细地描述一下你的答案吗?我不太确定格式字符串是怎么回事。它似乎不太适合本地化。多亏了adrift的参考。我喜欢这个主意,但除非你能使它更适合本地化,否则我认为扩展方法是可行的对于这一个。@Justin:你可以本地化格式字符串,就像你的“自由”字符串一样简单…(或者从本地化的“自由”字符串组成)。嗨,Reed。我同意我可以本地化规则,但这需要了解其他文化如何本地化其货币。因为这种行为是使用.ToString(“C”)内置到框架中的我喜欢它。我是这个特殊解决方案的粉丝。这是一个简洁的解决方案,在工具带中很好!我不太喜欢扩展方法是我的主要原因。但在这种情况下,这可能是一个糟糕的借口。最简单的解决方案往往是最好的,在这种情况下,扩展方法非常简单。顺便说一句:你有机会提供更多信息吗n关于值Ok…所以>解释了m。我很好奇什么值,即使它代表一个价格,小数点也可以是负数。如果您使用自定义类代替currency,您可以不允许这样做。