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()
格式化两个十六进制数字?
答案 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, "{", "}"
)