是否可以在转义的花括号之间使用字符串插值格式复合格式?

时间:2019-02-08 18:14:23

标签: c# string-interpolation format-string

我想用转义的花括号(“ {{”和“}}”)之间的格式化值构建字符串。

我宁愿使用 format string 而不是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 :(得分:-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}}}"));