【发布时间】:2010-10-05 23:38:31
【问题描述】:
前几天我看到一个代码 sn-p 将布尔值转换为相应的“是”/“否”值:
CDbl(True).ToString("Yes;Yes;No")
代码工作正常,但我很好奇它是如何工作的,我无法在MSDN documentation for ToString() 中找到答案。
有人能解释一下吗?
【问题讨论】:
前几天我看到一个代码 sn-p 将布尔值转换为相应的“是”/“否”值:
CDbl(True).ToString("Yes;Yes;No")
代码工作正常,但我很好奇它是如何工作的,我无法在MSDN documentation for ToString() 中找到答案。
有人能解释一下吗?
【问题讨论】:
Steve-X 拥有迄今为止我见过的最好的 String.Format 文档:Steve-X ToString()
我知道您要求“ToString”,但 ToString 取决于您正在调用的实现(即 DateTime.ToString()、decimal.ToString...等)。
如果您真的对它的工作原理感兴趣,请打开 reflector 并仔细阅读代码。
【讨论】:
正如@Joel Coehoorn 和@tvanfosson 所说,它使用的是自定义数字格式字符串。它起作用的原因是布尔值可以使用以下(基本上)转换为双精度:
public static double ToDouble(bool value)
{
return (value ? ((double) 1) : ((double) 0));
}
因此,如果 value 为 true,则返回 1,如果 value 为 false,则返回 0。此时,应用部分映射规则,如 @tvanfosson(以及随后的 @Joel Coehoorn)所述。
【讨论】:
它将其视为Custom Numeric Format String。具体请参见链接页面中关于部分分隔符的部分:
';'字符用于分隔格式字符串中正数、负数和零数的部分。如果自定义格式字符串中有两个部分,最左边的部分定义正数和零数的格式,而最右边的部分定义负数的格式。 如果有三个部分,最左边的部分定义正数的格式,中间的部分定义负数的格式,最右边的部分定义零数的格式。
【讨论】:
它使用自定义数字格式字符串中的文字格式字符串。您可以提供映射到正数、负数或零数的数字的文字。第一个“是”映射为正,第二个映射为负,“否”映射为零。因此,任何非零都是肯定的,只有零是否定的。这相当于对数值的标准真/假语义解释。
查看Custom Numeric Format 字符串页面的“部分分隔符”。
【讨论】:
查看here 和here,获取官方文档。 还有来自 Jhon Sheehan 博客的这个伟大的 cheatsheet!
【讨论】: