String.Format()带前导零的十六进制不适用于第二个参数

时间:2015-02-28 11:11:07

标签: c# string.format

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);
    }
}

调试器输出打印出:

Debugger output

编辑:如果我在格式字符串的开头和结尾删除花括号似乎有效,但后来我遗漏了从ToString()返回的字符串中的那些(调试器仍然将这些添加到QuickWatch窗口):

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

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

1 个答案:

答案 0 :(得分:4)

小心所有关闭大括号}}}。 您可以为其使用单独的格式项,如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, "{", "}"
  )