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

标签 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() 格式化两个十六进制数?

最佳答案

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

关于c# - String.Format() 带前导零的十六进制不适用于第二个参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28781022/

相关文章:

java - 如何格式化像#.#.#.#这样的字符串

c# - ASP.net 代码在 C# 背后和背后

c# - RichTextBox 垂直显示文本

c# - 以编程方式在 Crystal Report C# 中创建公式字段

c# - 需要帮助理解代码

python - 使用 Python 中的 format() 方法打印 boolean 值 True/False

c# - 未知的构建错误

java - 在 java 字符串中转义 % 符号以应用 String.format

c# - 字符串的 System.FormatException

Python - 带有 .format 或 %s 的多行 raw_input