String.Format:十六进制(" X")格式说明符和零(0)

时间:2017-04-19 21:40:20

标签: c# hex string-formatting

现在,这是一个奇怪的问题,我将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} }}"

1 个答案:

答案 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?中给出的答案。由于这个原因,我将问题标记为可能重复。