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

Why does String.Format converts minus to parenthesis

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

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

amount 为负时,它会将减号转换为括号 - 如下所示

-11.00 --> (.00)

我需要这个

-11.00 --> -.00

我该如何解决这个问题?

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

简单的解决方案是使用:

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

但是 USD 符号是硬编码的(顺便说一下,这是比在减号后写 USD 符号更“正确”的变体,如上一行代码所示)。如果你想让它灵活又自定义,你可以从系统文化设置中获取货币信息和小数点分隔符,直到它符合你的要求。

括号显示负货币的首选会计格式,至少在美国是这样。参见 this UX.SE post

如果您不想遵循该约定,您可以创建自己的 NumberFormatInfo:

var format = CultureInfo.CreateSpecificCulture("en-US").NumberFormat;

// "1" means "-$n"
format.CurrencyNegativePattern = 1;

string.Format(format, "{0:C}", -1m) // "-.00"

请参阅 this 以获取可放入 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 ₿)