【问题标题】:Explaining confusing conditional string format解释令人困惑的条件字符串格式
【发布时间】:2014-09-02 16:34:44
【问题描述】:

一位前同事写道:

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:#;;} 和第二部分。我想为指定年龄(年,年...)做同样的事情

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

【问题讨论】:

标签: c# formatting string.format


【解决方案1】:

这是一个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 语句——使用自定义数字格式字符串在最糟糕的情况下是“聪明的”......

【讨论】:

  • 我……等等……什么?编辑...感谢您进一步解释
  • 这是一个非常聪明的字符串格式用法。同样重要的是,只有正值才会打印实际数字(因为#;; 是第一种格式)。
  • @CalvinSmith:我已经对其进行了进一步编辑 - 这可能会有所帮助。
  • @MarcinJuraszek:是的,但在这种情况下,我会使用“相当聪明”这个词的贬义。这不是我真正想看到的代码...
  • @CalvinSmith:是的,在某些情况下,比如热情地憎恨你的同事;)我同意这很有趣。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-05-19
  • 2019-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-03
  • 1970-01-01
相关资源
最近更新 更多