【问题标题】:String.Format() Hex with leading zero doesn't work for second argument带前导零的 String.Format() Hex 不适用于第二个参数
【发布时间】:2015-02-28 19:36:08
【问题描述】:

String.Format() 遇到了一个奇怪的问题。我需要用前导零格式化两个十六进制数字以填充最多 8 位数字。但是,它仅适用于第一个参数 ({0:X8})。对于第二个参数 ({1:X8}),只打印“X8”。

这是我的代码:

public struct DataDirectory
{
    public uint VirtualAddress
    {
        get;
        internal set;
    }

    public uint Size
    {
        get;
        internal set;
    }

    public override string ToString()
    {
        return String.Format("{{VirtualAddress=0x{0:X8},Size=0x{1:X8}}}", VirtualAddress, Size);
    }
}

调试器输出如下:

编辑:如果我删除格式字符串开头和结尾的花括号,它似乎可以工作,但是我错过了从 ToString() 返回的字符串中的那些(调试器仍然将它们添加到 QuickWatch 窗口):

return String.Format("VirtualAddress=0x{0:X8},Size=0x{1:X8}", VirtualAddress, Size);

是否可以用String.Format() 格式化两个十六进制数字?

【问题讨论】:

    标签: c# string.format


    【解决方案1】:

    小心所有右括号}}}。 您可以为其使用单独的格式项,如Size=0x{1:X8}{2}。所以:

    String.Format("{{VirtualAddress=0x{0:X8},Size=0x{1:X8}{2}", 
      VirtualAddress, Size, "}"
      )
    

    {1:X8}}} 的问题在于不清楚哪个双精度 }} 是转义的 },哪个单 } 正在关闭该项目。解析器实际上调用了Size.ToString("X8}"),这不是您想要的。

    现在你正朝着那个方向前进,也许会这样做:

    String.Format("{2}VirtualAddress=0x{0:X8},Size=0x{1:X8}{3}", 
      VirtualAddress, Size, "{", "}"
      )
    

    【讨论】:

    • 我想我现在明白你的意思了。 String.Format() 似乎将{0x{1:X8_}}_} 的前两个右花括号检测为转义,最后一个失去任何意义。根据您的解决方案替换它们,这不会给我 two 闭合花括号吗?实际上我只是想要一个(因为他们告诉我}} 在字符串中变成了})。
    • @DebugErr 你是对的。 Size.ToString("X8}") 被视为自定义格式字符串,而不是标准格式字符串。返回的字符串成为该项目的结果并且是"X8}",无论Size 具有什么值。我多次尝试改进我的答案。
    • 我明白了。我花了一些时间才得到它,因为我认为解析器读取了一个左花括号(-> 参数开始),而下一个右花括号将是一个参数结尾,因为到目前为止,在参数格式中不允许右花括号我所知。显然情况并非如此。我认为这种方式有点愚蠢,但在某些情况下这种行为可能更正确。
    • 这里是MSDN String.Format Q & A,他们建议为文字大括号使用单独的格式项。这里是MSDN Custom numeric format strings 以了解"X8}" 的格式。
    • 好文章,我可以参考一些建议。 X8} 也是一个很好的笑脸,顺便说一句。
    猜你喜欢
    • 1970-01-01
    • 2021-04-07
    • 1970-01-01
    • 2017-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-11
    • 1970-01-01
    相关资源
    最近更新 更多