自定义数字格式字符串以始终显示符号

234

有没有办法指定标准或自定义数值格式字符串,以始终输出符号,无论是正还是负(虽然对于零应该做什么我不确定!)

6个回答

361

可以,你可以使用条件格式。请参阅MSDN中的条件格式

例如:

string MyString = number.ToString("+0;-#");

每个由分号分隔的部分代表正数和负数。

或者:

string MyString = number.ToString("+#;-#;0");

如果您不希望零有正号。


1
修复了一个错误,即负数没有得到减号。 - Roman Starkov
6
对于值为0,使用+#;-#格式化后只会得到"+",而没有实际的0。我希望0显示为"+0",因此可以使用+#;-#;+0格式化字符串来实现这一点。 - orion elenzil
4
谢谢!将这个与 '' 搭配使用会有很好的效果!看看这个:Changes.ToString("'('#' ▲)';'('#' ▼)';''")!它节省了我大量时间和成百上千的 if 语句! :) - Shahab
1
@orionelenzil 我也遇到了同样的问题。你可以使用+0;-#代替+#;-#;+0。这个答案对我来说真的很误导。 - Kamil Szot
2
@Shahab 我喜欢它。请注意,如果您不想显示带控制符号的数字值,甚至可以不显示... string msg = $"今天股市{delta:▲;▼;~}。" - Glenn Slayden
显示剩余2条评论

60

注意,在使用条件格式时,负值不会自动带有符号。您需要执行以下操作:

string MyString = number.ToString("+#;-#;0");

1
正如其他人指出的那样,+0;-# 可以让你用更简洁的代码得到相同的结果。 - Andrew

50
您可以在string.Format()中使用格式字符串;格式字符串与索引用冒号(':')分隔。
var f = string.Format("{0}, Force sign {0:+#;-#;+0}, No sign for zero {0:+#;-#;0}", number);

对于数字 { +1, -1, 0 } ,将会得到以下结果:

1,带正号 +1,0 不带符号 +1
-1,带负号 -1,0 不带符号 -1
0,带正号 +0,0 不带符号 0

您还可以使用插值字符串来获得相同的结果,而不是使用 string.Format

var f = $"{number}, Force sign {number:+#;-#;+0}, No sign for zero {number:+#;-#;0}";

你的答案最后一行应该写上“默认格式0,强制符号+,零不显示符号0”,因为这是对于数值0使用+#;-#格式的实际结果。 - Kamil Szot
谢谢,Kamil - 我错过了那个。我现在已经更正了强制符号格式:+#;-#;+0(而不是+#;-#)。 - Edward
1
你可以使用更简单的格式来获取正负号的行为:+0;-#。 :) - Andrew
@Andrew,确实,但我更喜欢使用 +#;-#;+0 而不是 +#;-#,因为这使得 0 显示为 +0 更清晰。 - Edward

15

与其他回答相反,如果您想要获得+1、-1、+0(对于参数1、-1、0),则需要使用以下格式:

String.Format("{0:+#;-#;+0}", 0));  // output: +0
或者
String.Format("{0:+0;-#}", 0));  // output: +0

如果你只使用+#;-#,它将仅显示+(而不是+0)用于0。

"#"自定义格式说明符(位于https://msdn.microsoft.com/en-us/library/0c899ak8.aspx

请注意,即使零是字符串中唯一的数字,此说明符也永远不显示不是显著数字的零。 它仅在要显示的数字中零是显著数字时才显示零。

此外,请记住,如果需要任何小数精度,您需要像这样指定:

String.Format("{0:+0.##;-#.##}", 0));  // output: +0

如果你希望零始终显示出来,可以这样做:

String.Format("{0:+0.00;-#.00}", 0));  // output: +0.00

1
任何类型的数值表达式:
+###,###,###,###,###,###,###,###,###,##0.###,###,###,###,###,###,###,###,###,###;-###,###,###,###,###,###,###,###,###,##0.###,###,###,###,###,###,###,###,###,###;0

对于三种情况(正数、负数和零),使用三个部分

示例的其他方面:

  • 零没有符号。您可以将其显示为任何内容,例如“零”。

  • 小于一的绝对值在小数点前有一个前导0。根据需要进行调整。

  • 数字位数适用于最大和最小绝对十进制值。根据需要进行调整。

  • 小数点字符是特定于文化的。.NET会替代它。

  • 分组分隔符是可选的。该字符是特定于文化的。 .NET会替代它。(位置也是特定于文化的,但这仅受格式字符串控制。)您还可以使用除Format的特殊字符之外的任何其他字符(包括, . # 0)。


5
#,##0格式足以满足任何数量的千位分隔符。 - navigator

0

我无法评论,所以在这里回答(该破烂的声望系统....)

您可以很好地使用number.ToString("+0;-#")来生成UTC字符串时间格式。

以下是PowerShell代码示例:

"$([System.DateTime]::Now.ToString('HH:mm:ss.fff'))$($([System.TimeZoneInfo]::Local.GetUtcOffset([System.DateTime]::Now).TotalMinutes.ToString('+0;-#')))"

谢谢 @gcores https://stackoverflow.com/users/40256/gcores


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