【问题标题】:String.Format: Hexadecimal ("X") Format Specifier and Zero (0) [duplicate]String.Format:十六进制(“X”)格式说明符和零(0)[重复]
【发布时间】:2017-09-16 07:44:24
【问题描述】:

现在,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}"

我不知道发生这种情况的“原因”。我也尝试用谷歌搜索它并没有找到答案。所以我来看看是否有人对此有所了解。

顺便说一句,我正在使用 VS2015 和 .Net4.5


编辑:原来问题在于字符串中的结尾}}。不过对我来说还是很奇怪。 似乎是格式化引擎中的一个错误,就像我在中间添加一个空格一样,它会起作用。点赞:$"{{{LowPart:X}-{HighPart:X} }}"

【问题讨论】:

    标签: c# hex string-formatting


    【解决方案1】:

    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:”)被解释为 格式化项目。

    下一个字符(“D”)将被解释为十进制标准 数字格式说明符,但接下来的两个转义大括号 ("}}") 产生 一个大括号。因为生成的字符串 ("D}") 不是标准 数字格式说明符,结果字符串被解释为 自定义格式字符串,表示显示文字字符串“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? 中的回答,因此我将问题标记为可能重复。

    【讨论】:

    • 这不是问题,问题在于格式化以“}}”结尾的字符串并使用值为0的“X”,格式化引擎无法解析字符串,因此给出了错误结果。
    • 你坚持不懈地寻找解决方案值得一票
    • 赞成并接受。昨天搜索了一个小时后,我找不到任何相关内容。谢谢
    • @Soroush Falahati 不客气,也谢谢你。这个问题让我很好奇。我也想赎回自己:)
    猜你喜欢
    • 2015-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-22
    • 2021-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多