我试图找出我的单元测试失败的原因(下面的第三个断言):
var date = new DateTime(2017, 1, 1, 1, 0, 0);
var formatted = "{countdown|" + date.ToString("o") + "}";
//Works
Assert.AreEqual(date.ToString("o"), $"{date:o}");
//Works
Assert.AreEqual(formatted, $"{{countdown|{date.ToString("o")}}}");
//This one fails
Assert.AreEqual(formatted, $"{{countdown|{date:o}}}");
Run Code Online (Sandbox Code Playgroud)
AFAIK,这应该可以正常工作,但看起来它没有正确传递格式化参数,它只显示为{countdown|o}代码.知道为什么会失败吗?
输入: uint hex = 0xdeadbeef;
所需输出: string result = "{deadbeef}"
第一种方法:明确添加{和}; 这工作:
result = "{" + string.Format("{0:x}", hex) + "}"; // -> "{deadbeef}"
Run Code Online (Sandbox Code Playgroud)
使用转义大括号输出为十进制而不是十六进制:
result = string.Format("{{{0}}}", hex); // -> "{3735928559}"
Run Code Online (Sandbox Code Playgroud)
似乎很有希望,现在我们需要做的就是:x按照上面的第一种方法添加十六进制说明符:
result = string.Format("{{{0:x}}}", hex); // -> "{x}"
Run Code Online (Sandbox Code Playgroud)
哦,亲爱的,添加它':x已经使它输出"{x}"而不是"{deadbeef}"我想要的.
所以我的问题是:我必须通过显式添加{和}按照第一个示例来解决这个问题,或者有没有办法使用复合格式化并转义大括号?
另请注意,这也会影响字符串插值(毕竟)只是由编译器转换为调用string.Format().
(这可能是重复的问题,但到目前为止我一直无法找到重复...)
编辑