【问题标题】:How to use string.Format() to format a hex number surrounded by curly brackets?如何使用 string.Format() 格式化用大括号括起来的十六进制数字?
【发布时间】:2016-10-13 08:42:09
【问题描述】:

输入: uint hex = 0xdeadbeef;

所需输出: string result = "{deadbeef}"

第一种方法:显式添加{};这行得通:

result = "{" + string.Format("{0:x}", hex) + "}"; // -> "{deadbeef}"

使用转义的大括号输出为十进制而不是十六进制:

result = string.Format("{{{0}}}", hex); // -> "{3735928559}"

看起来很有希望,现在我们需要做的就是按照上面的第一种方法添加 :x 十六进制说明符:

result = string.Format("{{{0:x}}}", hex); // -> "{x}"

天哪,添加':x 使其输出"{x}" 而不是我想要的"{deadbeef}"

所以我的问题是:我必须按照第一个示例通过显式添加{} 来解决这个问题,还是有办法使用复合格式并转义大括号?

另请注意,这也会影响字符串插值,它(毕竟)只是由编译器转换为对string.Format() 的调用。

(这很可能是重复的问题,但到目前为止我一直找不到重复的问题......)

编辑

【问题讨论】:

  • 请参阅msdn.microsoft.com/en-us/library/txafckwd(v=vs.110).aspx 中的“转义大括号” - 基本上您的解决方法就是解决方案。
  • 这看起来像是string.Format 中的一个错误。
  • @HansKesting 那篇文章实际上是这个问题的答案。如果您将其发布为答案,我会将其标记为正确。
  • 我可以看到他们实际上已经将此记录为一项功能,而不是一个错误。不过,它一个错误,从某种意义上说,如果你必须解释某些东西是如何被破坏的,它并不能使它正确。但是,由于这被记录为表现得像你只需要解决它。如果您遵循解释中的逻辑,那么"{{{0}}}" 也不应该工作,因为0} 不是一个有效的参数索引,但由于这工作它是不一致的。
  • 基本上我应该使用 RTFM。 :)

标签: c# string.format


【解决方案1】:

请参阅http://msdn.microsoft.com/en-us/library/txafckwd(v=vs.110).aspx 中的“转义大括号” - 基本上您的解决方法是一种解决方案。

从那里:

转义大括号的解释方式可能会导致意想不到的结果。 例如,考虑格式项“{{{0:D}}}”,它旨在 显示左大括号,格式化为小数的数值 数字和右大括号。但是,格式项实际上是 按以下方式解释:

1.前两个左大括号(“{{”)被转义并产生一个左大括号。
2. 接下来的三个字符(“{0:”)被解释为格式项的开始。
3.下一个字符(“D”)将被解释为十进制标准 数字格式说明符,但接下来的两个转义大括号 ("}}") 产生 一个大括号。因为生成的字符串 ("D}") 不是标准 数字格式说明符,结果字符串被解释为 自定义格式字符串,表示显示文字字符串“D}”。
4. 最后一个大括号(“}”)被解释为格式项的结束。
5. 显示的最终结果是文字字符串“{D}”。这 不显示要格式化的数值。

作为解决方案,根据您的示例进行调整:

uint hex = 0xdeadbeef;
string output = string.Format("{0}{1:x}{2}", 
                             "{", hex, "}");
Console.WriteLine(output);

【讨论】:

    【解决方案2】:

    我得到的最接近的是

    string.Format("{{{0:x}\u200B}}",16)
    

    似乎 }}} 被解释错误,插入一个零宽度的空格会阻止前两个 } 被扩展为转义的 } 字符。

    【讨论】:

      【解决方案3】:

      您可以使用空字符或添加括号作为参数:

      uint hex = 0xdeadbeef;
      string result = string.Format("{0}{1:x}{2}", "{", hex, "}");
      

      这将根据需要输出{deadbeef}

      发生这种情况是因为要以 string.Format 输出 },您必须像这样 }} 转义它。

      但是当您输入}}} 时,它会像}} } 一样理解这一点,并输出{x}。这是 C# 中的一个设计错误,当您尝试将输出格式化为 :x:N 或其他格式时。

      你也可以试试

      uint hex = 0xdeadbeef;
      string result = string.Format("{{ {1:x} }}", hex);
      

      但这会输出带有空格的{ deadbeef }

      【讨论】:

      • 这是string.Format 中的错误,而不是 C#。
      • @LasseV.Karlsen 有什么显着差异?
      • 看我的问题。
      【解决方案4】:

      试试这个:使用2次String.Format这样的方法

      String result= String.Format("{{{0}}}",String.Format("{0:x}", hex));
      

      【讨论】:

      • 此时不需要格式化参数,可以使用hex.ToString("x")
      • @CodeCaster op 正在寻找什么将这个十六进制字符串包装到大括号中 {deadbeef}
      • 你没有抓住重点。而不是String.Format("{0:x}", hex),可以简单地使用hex.ToString("x")
      猜你喜欢
      • 2022-11-01
      • 1970-01-01
      • 2015-01-16
      • 2022-11-30
      • 2018-09-25
      • 1970-01-01
      • 2014-09-28
      • 2012-07-22
      • 1970-01-01
      相关资源
      最近更新 更多