Можно ли использовать составное форматирование в формате интерполяции строк между экранированными фигурными скобками?

Я хочу построить строку с отформатированным значением между экранированными фигурными скобками ("{{" и "}}").

Я бы предпочел использовать форматную строку вместо метода 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}}}"));
Другие вопросы по тегам