自定义数字格式否定部分错误

时间:2017-01-16 21:32:40

标签: c# string-formatting number-formatting

不确定这是100%的错误,但行为真的很奇怪。我的任务是正确的格式分数。例如,如果:

 int numerator = -7;
 int denominator = 100;

然后如果应用了下一行代码:

string fraction = numerator.ToString("#/"+ denominator +";-#/" + denominator +";0");

这是根据microsofts的部分分隔符逻辑:https://msdn.microsoft.com/en-us/library/0c899ak8%28v=vs.110%29.aspx?f=255&MSPPError=-2147217396#The

应该产生" 7/100"如果分子为正(7)," -7 / 100"如果分子为负(-7)和" 0"如果是分子0.因为格式字符串看起来像这样"#/ 100; - #/ 100; 0"

但由于某种原因,它不适用于负面情况。如果分子正数全部按预期运行,但如果由于某种原因它是负数,它将替换生成的字符串中的最后一位数。所以我最终输出如下:" - / 107"。有什么想法吗?

2 个答案:

答案 0 :(得分:4)

您的格式字符串是"#/ 100; - #/ 100; 0"。这是一个非常奇怪的格式字符串。你在说:

  • 如果数字为正数,请使用"#/ 100"。
  • 的格式
  • 如果数字为负数,请使用" - #/ 100"。
  • 的格式
  • 如果数字为零,请使用" 0"。
  • 的格式

对于前两种情况,您有3位数占位符,第一位是可选的(只有在打印3位或更多位数时才会出现),最后两位是必需的(所以他们否则会显示0)。 " /"和" 1"字符没有特殊含义,因此它们会按原样出现。

所以我们有:

   1 => /101
  12 => /112
 123 => 1/123
  -1 => -/101
 -12 => -/112
-123 => -1/123

所有这些都在记录中工作 - 而不是你希望它如何工作。听起来你可能想要引用 100,这样0就不会成为占位符了。格式字符串为"#/' 100'; - #/' 100&#39 ;; 0"产生的输出:

   1 => 1/100
  12 => 12/100
 123 => 123/100
  -1 => -1/100
 -12 => -12/100
-123 => -123/100

...但我建议不使用格式字符串来生成:

string text = numerator == 0 ? "0" : numerator + "/" + denominator;

答案 1 :(得分:1)

0是一个有效的占位符,就像#一样,似乎只使用了右边的第一个占位符(0中的100)。<登记/> 您可以使用'

对该部分进行硬编码
string fraction =  numerator.ToString("#/'"+ denominator +"';-#/'" + denominator +"';0");

产生-7/100