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

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

Я бы предпочел использовать строку формата вместо 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 Ответ

0 голосов
/ 09 февраля 2019

Вы можете использовать преобразование 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}}}"));
...