解释令人困惑的条件字符串格式化

8

一位前同事写道:

String.Format("{0:#;;} {1:records;no records;record}", rows, rows - 1);
//Rows is a integer value

我读了这些文章:

Code Project - .NET中的自定义字符串格式
MSDN - 自定义数字格式字符串

但是我仍然不理解这个格式是如何工作的。显然,我可以看到输出结果,但是我不明白{0:#;;}和第二个是什么意思。我想用相同的方法指定年龄(年,岁...)

我对这个字符串格式非常好奇。有人能解释一下这种行为吗?作者已经不在我们公司工作了。


1
";"节分隔符 - Sergey Kalinichenko
1个回答

10

这是一个自定义数字格式字符串,基本上是 - 但说实话,这是一种相当奇怪的格式。事实上,它有两个:

#;;
records;no records;record

每种情况都有三个部分,因为有两个“分节符”(即半角分号):

第一部分适用于正数,第二部分适用于负数,第三部分适用于零。

由于开发人员将rows-1用作第二个格式字符串要格式化的值,所以您的情况变得更加复杂,因此实际上是:

  • 如果rows大于1(因此rows-1为正),则为records
  • 如果rows等于0(因此rows-1为负),则为no records
  • 如果rows等于1(因此rows-1为零),则为record

如果rows为正,则第一个格式字符串仅包括rows的值(由于使用了#)。所以最终结果是:

Rows     Result
   2     2 records  (ditto for other values greater than 1)
   1     1 record
   0     no records

就我个人而言,我要么会使用条件运算符,要么使用if/else语句——使用自定义数字格式字符串是最差的“聪明”方法...


我...等等...什么?编辑...感谢进一步解释。 - DidIReallyWriteThat
这是一个相当聪明的字符串格式用法。同样重要的是,只有正数才会被打印出来(因为在第一个格式中使用了#;;)。 - MarcinJuraszek
@CalvinSmith:我进一步编辑了它 - 这可能会有所帮助。 - Jon Skeet
1
@CalvinSmith:是的,某些情况下比如热恨同事 ;) 我同意这很有趣。 - Jon Skeet
保罗和约翰立刻想出了很棒的场景。 - DidIReallyWriteThat
显示剩余4条评论

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