现在,这是一个奇怪的问题,我将String.Format格式化为十六进制字符串。请看下面的例子:
public override string ToString()
{
return $"{{{LowPart:X}-{HighPart.ToString("X")}}}";
}
上面的代码正常工作,HighPart
为零,但以下两个代码给出了错误的结果:
public override string ToString()
{
return $"{{{LowPart:X}-{HighPart:X}}}";
}
public override string ToString()
{
return string.Format("{{{0:X}-{1:X}}}", LowPart, HighPart);
}
如果LowPart
为50且HighPart
为0,则这两个都将返回"{32-X}"
而不是"{32-0}"
。
我不知道"为什么"这发生了。我也试过谷歌搜索,没有找到答案。所以我在这里看看是否有人对此有所了解。
BTW,我使用的是VS2015和.Net4.5
编辑:原来问题在于字符串中的结尾}}
。虽然对我来说仍然很奇怪。
看起来像格式化引擎中的错误,好像我在中间添加一个空格,它会工作。喜欢:$"{{{LowPart:X}-{HighPart:X} }}"
答案 0 :(得分:2)
Console.WriteLine(string.Format("{0:X}", 50));
返回32.十进制的50是十六进制的32,因为2 * 16 ^ 0 + 3 * 16 ^ 1 = 2 + 48 = 50
在了解问题后进行编辑:
我相信此页面包含答案(https://msdn.microsoft.com/en-us/library/txafckwd(v=vs.110).aspx)
解释转义大括号的方式会导致意外结果。 例如,考虑格式项" {{{0:D}}}",这是预期的 显示左括号,一个格式为十进制的数值 数字和右括号。但是,格式项实际上是 按以下方式解释:
前两个开口大括号(" {{")被转义并产生一个开口 支架
接下来的三个字符(" {0:")被解释为a的开头 格式项目。
下一个字符(" D")将被解释为十进制标准 数字格式说明符,但接下来的两个转义大括号("}}")会产生 单支撑。因为结果字符串(" D}")不是标准字符串 数字格式说明符,结果字符串被解释为a 自定义格式字符串,表示显示文字字符串" D}"。
最后一个大括号("}")被解释为格式项的结尾。
显示的最终结果是文字字符串," {D}"。该 将不显示要格式化的数值。
所以" {1:X}}}"被解释为" X}",因为它试图应用" X}"这是不被承认的。在String.Format中也是如此(" {0:HELLO}",50)
解释这个问题的功劳归于Hans Kesting在How to use string.Format() to format a hex number surrounded by curly brackets?中给出的答案。由于这个原因,我将问题标记为可能重复。