为什么String.Format将减号转换为括号



我正在使用String.Format$符号添加到值中。

var result = string.Format("{0:C}", Convert.ToDecimal(amount));

amount为负数时,它会将减号转换为括号,就像下面一样

-11.00 --> ($11.00)

我需要这个

-11.00 --> -$11.00

如何解决此问题

括号是显示负货币的首选会计格式,至少在美国是这样。请参阅此UX.SE帖子。

如果你不想遵循这个惯例,你可以创建自己的NumberFormatInfo:

var format = CultureInfo.CreateSpecificCulture("en-US").NumberFormat;
// "1" means "-$n"
format.CurrencyNegativePattern = 1;
string.Format(format, "{0:C}", -1m) // "-$1.00"

有关可以放入CurrencyNegativePattern中的值的列表,请参见此。

如果您不想使用标准区域性,那么实际上您对数字的输出方式有很大的控制权。事实上,如果你愿意,你可以自己制作货币符号。

以下是如何自定义decimal.ToString输出:

var money = -4.21345m;
var ni = new System.Globalization.NumberFormatInfo()
{
CurrencySymbol = "₿",
CurrencyDecimalDigits = 5,
};
for (var i = 0; i < 16; i++)
{
ni.CurrencyNegativePattern = i;
Console.WriteLine(money.ToString("C", ni));
}

这给了我:

(₿4.21345)
-₿4.21345
₿-4.21345
₿4.21345-
(4.21345₿)
-4.21345₿
4.21345-₿
4.21345₿-
-4.21345 ₿
-₿ 4.21345
4.21345 ₿-
₿ 4.21345-
₿ -4.21345
4.21345- ₿
(₿ 4.21345)
(4.21345 ₿)

很抱歉这么说,但对于C文字,输出(11.00美元(是正确的。这是一种典型的书写负数的记账格式。您可以在Windows设置中对此进行更改,但更改将是系统的全局更改,这可能不是您想要的。

简单的解决方案是使用:

var result = string.Format("${0:0.00}", Convert.ToDecimal(amount));

但美元符号是硬编码的(顺便说一句,这比在最后一行代码中所示的减号后面写美元符号更"正确"(。如果您想使其灵活且自定义,您可以从系统区域性设置中获取货币信息和小数分隔符,直到其符合您的要求。

相关内容

最新更新