Можно ли использовать составное форматирование в формате интерполяции строк между экранированными фигурными скобками?
Я хочу построить строку с отформатированным значением между экранированными фигурными скобками ("{{" и "}}").
Я бы предпочел использовать форматную строку вместо метода ToString() для форматирования значения.
//Works fine but don't use composite format string
$"{{{Math.PI.ToString("n2")}}}" // return {3.14}
//Use composite format string but does not work
$"{{{Math.PI:n2}}} // return {n2}
//Use composite format string but does not work
$"{{{null:n2}}} // return {
//Use composite format string, work fine but I do not want extra space
$"{{{Math.PI:n2} }} // return {3.14 }
1 ответ
Вы можете использовать FormattableString
преобразование из интерполированной строки для вызова пользовательского IFormatter для решения проблемы. К сожалению, вы не можете использовать метод расширения, потому что неявное преобразование из интерполированной строки в FormattableString
не происходит для цели метода расширения.
public class HandleBraces : IFormatProvider, ICustomFormatter {
public string Format(string format, object arg, IFormatProvider formatProvider) =>
(format != null && format.EndsWith("}")) ? String.Format($"{{0:{format.Substring(0, format.Length - 1)}{'}'}", arg) + "}"
: null;
public object GetFormat(Type formatType) => this;
static HandleBraces HBFormatter = new HandleBraces();
public static string Fix(FormattableString fs) => fs.ToString(HBFormatter);
}
Теперь вы можете использовать Fix
:
Console.WriteLine(HandleBraces.Fix($"{{{Math.PI:n2}}}"));