【发布时间】:2026-01-25 15:40:01
【问题描述】:
我已经多次偶然发现一个与插值字符串有关的问题。
考虑以下情况:
double number = 123.4567;
var str = $"{{{number:F2}}}"; //I want to get "{123.45}"
Console.WriteLine(str); // Will print "{F2}"
起初有点令人惊讶,但一旦你意识到大括号是如何配对的,它就会变得有意义。接下来的两个大括号是插值字符串中单个大括号的转义序列。所以插值表达式的左括号与字符串中的最后一个花括号配对。
___pair____
| |
$"{{{number:F2}}}";
现在您可以执行以下操作来中断转义序列:
var str = $"{{{number:F2} }}"; // This will be "{123.45 }"
请注意这种方法添加到输出中的空格字符。 (不理想)
我的问题:
假设我想使用 单个插值字符串 来准确获取输出“{123.45}”
如果不做类似以下的骇人听闻的事情,这是否可能?
var s = $"{{{number:F2}{'}'}";
【问题讨论】:
-
要得到想要的输出,你可以用
ToString作弊:$"{{{number.ToString("F2")}}}" -
@Xiaoy312 可能是目前最好的解决方案。我不得不说,这有点不直观,在这种情况下它以不同的方式解决了括号的奇偶性。
-
您对
$"{{{$"{number:F2}"}}}"感觉如何?我想从技术上讲它是两个字符串,但至少它不会破坏解析器。与@Xiaoy312 思路相同,分别格式化并插入到字符串中。这是具有奇怪解析规则的格式,类似于如果您想使用条件 (?:) 运算符,则必须执行的解决方法,冒号的存在会导致问题。 -
也许另一个不那么骇人听闻的选择就是破坏字符串。
$"{{{number:F2}"+"}",