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

时间:2014-09-02 16:34:44

标签: c# formatting string.format

一位前同事写道:

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

我读过这些文章

Code Project - Custom String Formatting in .NET
MSDN - Custom Numeric Format Strings

但我仍然不知道这种格式是如何运作的。显然我可以看到输出,但我不理解这部分{0:#;;}和第二部分。我想做同样的事情来指定年龄(年,年......)

我对这种字符串格式很好奇。有人可以解释这种行为吗?作者不再与我们合作。

1 个答案:

答案 0 :(得分:10)

这是custom numeric format string,基本上 - 但实际上是一个非常奇怪的。事实上,它是两个:

#;;
records;no records;record

在每种情况下,由于有两个section separators(分号),你有三个部分:

  

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

开发人员使用rows - 1作为要由第二个格式字符串格式化的值,使您的情况变得更加复杂,所以它确实是:

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

如果rows为正,则第一个格式字符串包含#的值(由于rows)。所以总体结果是:

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

就我个人而言,我会使用条件运算符,或者if / else语句 - 使用自定义数字格式字符串以最糟糕的方式“聪明”......