需要自定义货币格式来与String.Format一起使用

13
我正在尝试在C#中使用String.Format("{0:c}", somevalue),但是我很难弄清楚如何配置输出以满足我的需要。这里是我的需求:
  1. 0 输出为空
  2. 1.00 输出为 $1.00
  3. 10.00 输出为 $10.00
  4. 100.00 输出为 $100.00
  5. 1000.00 输出为 $1,000.00
我已经尝试过String.Format("{0:c}", somevalue),但对于零值,它输出$0.00,这不是我想要的。我也试过String.Format("{0:$0,0.00;$(0,0.00);#}", somevalue),但对于1.0,它输出$01.00。String.Format("{0:$0.00;$(0.00);#}", somevalue)可以解决大多数情况,但当somevalue是1000.00时,输出结果是$1000.00。
有没有一种格式可以适应上述的所有5种情况?我阅读的所有文档都只详细介绍了基础知识,并没有涉及到这种类型的场景。

如果(money > 0)则输出文本; - MrFox
5个回答

19
如果您使用的是:
string.Format("{0:$#,##0.00;($#,##0.00);''}", value)

你将会得到“”作为零值,而其他值也应该被适当地格式化。

这就是我一直在寻找的东西。我正在使用 Repeater 进行格式化,并希望找到简单而简洁的解决方案。 - Notorious2tall
安德鲁的回答也起作用了,如果我在代码后端做这个,我会选择他的解决方案,甚至不尝试弄清楚String.Format。但我正在寻找优雅的解决方案。不过任何人都无法读懂我的想法。 :) - Notorious2tall
+1 我赞成。非常好。你可以详细解释一下这是如何工作的吗? - Jeeva Subburaj
当值为数字时,字符串格式{0:A;B;C}检查该值是正数、负数还是零。如果它是正数,则使用A,负数使用B,零使用C作为格式。 - DavGarcia
1
这个解决方案忽略了当前的文化/数字设置。 是否可以使用相关的文化设置(System.Globalization.CultureInfo.CurrentCulture.NumberFormat)格式化数字,但对于零显示为空? - Stuart Helwig

4

尝试像这样:

String currency = (number == 0) ? String.Empty : number.ToString("c");

4

根据您是否始终使用相同的数据类型来存储所有货币值,您可以编写一个扩展方法,使得您的情况始终符合要求。例如,如果您正在使用 decimal 类型:

public static string ToCurrencyString (this decimal value)
{
  if (value == 0)
    return String.Empty;
  return value.ToString ("C");
}

0

0

"C" 货币格式在大多数情况下都很好用,除非你需要将 0 显示为空白。这里有两种方法,其中一种是上面提到的,类似于我常用的方法,可以让你将 0 显示为空白:

// one way
string.Format("{0:$#,##0.00;($#,##0.00);''}", somevalue)

// another way
somevalue.ToString("$#,##0.00;($#,##0.00);''")

第二种技术感觉更加“流畅”,如果您喜欢这种编码方式(就像我一样)。

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