C#创建自定义NumberFormatInfo以在货币值为$0.00时显示“Free”。

4

我需要在我的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(string format, IFormatProvider formatProvider)方法来实现,但我不确定该如何去做。显然,我希望尽可能多地重用NumberFormatInfo,并且仅在输入为0时覆盖它。在这种情况下,我可以简单地返回一个包含“免费”字符串的本地化资源。
那么我该怎么做呢?
谢谢

2
我建议引入一个货币类(Money/Currency),而不是传递十进制数。这样你就可以更轻松地执行此操作,因为Currency比十进制数拥有更多的功能。 - Chris Missal
4个回答

17

使用

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

2
+1,不错。对于那些之前没有看过的人:分号作为区段分隔符 - Jeff Ogata
听起来很有趣。你能提供一个参考或者更详细地描述一下你的答案吗?我不太确定格式字符串在这里到底是怎么回事。它似乎不太友好于本地化。 - Justin
感谢adrift提供的参考。我喜欢这个想法,但除非你能使它具有本地化友好性,否则我认为扩展方法是这个问题的解决方式。 - Justin
3
@Justin:你可以像本地化“自由”字符串一样轻松地本地化格式字符串(或从本地化的“自由”字符串中组合它)。 - Reed Copsey
嗨,里德。我同意我可以本地化规则,但这需要了解其他文化如何本地化他们的货币。由于这种行为是使用.ToString("C")内置到框架中的,所以我更喜欢它。我是这个特定解决方案的粉丝,它很简洁,非常适合在工具箱中拥有! - Justin

4

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

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

如果你想使用 IFormatProviderMSDN上有一个很好的例子。


我并不是扩展方法的铁粉,这是我的主要原因。但在这种情况下,这可能是一个很差的借口。最简单的解决方案通常是最好的,在这种情况下,扩展方法非常简单。 - Justin
顺便问一下,您能否提供有关value <= 0m的更多信息?我对0m语法不是很熟悉。谢谢! - Justin
好的...所以<a href="http://msdn.microsoft.com/en-us/library/364x0z75(VS.71).aspx">decimal</a>解释了m。我很好奇一个负数<= 0m会返回什么值。但是我想在这种情况下没有负价格这样的东西。 - Justin
1
尽管它代表价格,但小数可以是负数。如果您使用自定义货币类,则可以禁止这种情况发生。 - Chris Missal

2
如何使用扩展方法:

可以使用扩展方法:

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

那么

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

0

不要每次都使用自定义的IFormatProvider并传递它,可以考虑这样做:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接