【问题标题】:Custom Numeric Format Negative section bug自定义数字格式负部分错误
【发布时间】:2017-01-16 21:32:39
【问题描述】:

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

 int numerator = -7;
 int denominator = 100;

如果应用下一行代码:

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

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

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

但由于某种原因,它不适用于负面情况。如果分子为正,则所有行为都符合预期,但如果由于某种原因为负,它将替换生成的字符串中的最后一个数字。所以我最终得到这样的输出:“-/107”。有什么想法吗?

【问题讨论】:

  • 如果您只是将格式字符串硬编码为“#/100;-#/100;0”,对您的帮助会更简单。为什么要在其中引入变量?
  • 100 这只是一个例子。分母可以是任意数字

标签: c# string-formatting number-formatting


【解决方案1】:

您的格式字符串是“#/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';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;

【讨论】:

  • 感谢您的帮助。这是我错过的。
【解决方案2】:

0 是一个有效的占位符,就像# 一样,似乎只是使用了右边的第一个占位符(即100 中的0)。
您可以使用' 将那部分硬编码为

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

产生-7/100

【讨论】:

  • 非常感谢。这正是我错过的。如果分母是任何其他数字,它可以正常工作,但是当它为零时,它的行为与您描述的完全一样。添加“'” - 表示应将包含的字符原样复制到结果字符串中。谢谢。
猜你喜欢
  • 1970-01-01
  • 2017-10-06
  • 2012-12-12
  • 2010-10-18
  • 2020-12-09
  • 1970-01-01
  • 2017-12-29
  • 2020-06-26
  • 2013-12-26
相关资源
最近更新 更多