相关疑难解决方法(0)

字符串插值问题

我试图找出我的单元测试失败的原因(下面的第三个断言):

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}代码.知道为什么会失败吗?

c# string-interpolation c#-6.0

41
推荐指数
2
解决办法
2085
查看次数

如何使用string.Format()格式化大括号括起来的十六进制数?

输入: 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().

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

编辑

c# string.format

13
推荐指数
1
解决办法
1836
查看次数

标签 统计

c# ×2

c#-6.0 ×1

string-interpolation ×1

string.format ×1