转义字符关联性C#6字符串插值

时间:2017-03-24 07:16:29

标签: c# string string-formatting string-interpolation

假设:

    WebApiConfig.Register:
    public static void Register(HttpConfiguration config)
    {
        //OData routes
        var salesModel = ModelBuilder.GetSalesModel(); // this just builds an edm model with the required entities
        config.MapModelBoundODataServiceRoute(routeName: "salesRoute", routePrefix: "odata/Sales", configureAction: action =>
        {
            action.AddDefaultODataServices()
            .AddService<IEdmModel>(ServiceLifetime.Singleton, s => salesModel)
            .AddService<IEnumerable<IODataRoutingConvention>>(ServiceLifetime.Singleton, sp =>
            {
                return ODataRoutingConventions.CreateDefault()
                .Concat(new[] { new ModelBoundODataAttributeRoutingConvention(salesModel, "salesRoute", config) });
            })
        });

        var purchaseModel = ModelBuilder.GetPurchaseModel();
        config.MapModelBoundODataServiceRoute(routeName: "purchaseRoute", routePrefix: "odata/Purchase", configureAction: action =>
        {
            action.AddDefaultODataServices()
            .AddService<IEdmModel>(ServiceLifetime.Singleton, s => purchaseModel)
            .AddService<IEnumerable<IODataRoutingConvention>>(ServiceLifetime.Singleton, sp =>
            {
                return ODataRoutingConventions.CreateDefault()
                .Concat(new[] { new ModelBoundODataAttributeRoutingConvention(purchaseModel, "purchaseRoute", config) });
            })
        });
    }

和所需的输出:{Price = $ 5.05}

有没有办法将最后两个花括号关联为转义'}',以便插值按预期工作?就目前而言,前两个是逃逸的(我假设?),输出为:{Price = C}

double price = 5.05; 
Console.Write($"{{Price = {price:C}}}");

按预期工作,但有额外的空间。我可以连接尾部支架,我认为这是一个穷人的解决方案。有口语富人的解决方案吗?感谢。

5 个答案:

答案 0 :(得分:4)

这是因为&#34;古怪&#34;在string.Format的行为中,我们希望在生成的格式字符串中插值和插入之间进行精确的1对1映射。简而言之,语言行为精确地模拟了string.Format。

的行为

在插值(花括号内的东西)中,表达式以冒号(用于启动格式字符串)或结束大括号结束。在后一种情况下,加倍的大括号没有特殊含义,因为它不在字符串的文字部分内。因此,连续的三个花括号将被解释为接近插值,然后是文字(通过加倍转义)关闭花括号。但是在冒号之后,格式字符串被赋予该插值,并且该格式字符串是任何字符串,并且它由紧密的大括号终止。如果你想在你的格式字符串中使用一个紧密的大括号,你只需要将它加倍。这是你无意中做的。

CoolBots提供了处理此https://stackoverflow.com/a/42993667/241658

的最佳方式

阅读&#34;逃避大括号&#34; https://msdn.microsoft.com/en-us/library/txafckwd(v=vs.110).aspx部分正是对这个问题的解释。

答案 1 :(得分:3)

好奇的解决方法:

var p = price.ToString("C");
Console.Write($"{{Price = {p}}}");

出于某种原因,$"{{Price = {p}}}"$"{{Price = {p:C}}}"具有不同的关联结果,这感觉就像编译器错误。我会四处询问!请注意, string.Format应用相同规则的方式一致,因此它可能故意传播早期的框架奇怪。

答案 2 :(得分:2)

您可以插值而不是连接 - 将其作为字符串文字传递:

double price = 5.05;
Console.Write($"{{Price = {price:C}{"}"}");

答案 3 :(得分:0)

你可以尝试使用较少的转义字符。也许\ b会起作用,因为它不会打印任何东西,它在很长一段时间内都没有功能。类似的东西:

double price = 5.05;
Console.Write($"{{Price = {price:C}\b}}");

如果这对您不起作用,您可以尝试使用特殊的UNICODE字符,如U + 200B或U + FEFF:

double price = 5.05;
Console.Write($"{{Price = {price:C}\x8203}}");

转义字符:https://blogs.msdn.microsoft.com/csharpfaq/2004/03/12/what-character-escape-sequences-are-available/

UNICODE空格字符:https://www.cs.tut.fi/~jkorpela/chars/spaces.html

答案 4 :(得分:0)

当C#6语法出现问题时,为什么不使用传统的string.Format()呢?

double price = 5.05;
Console.WriteLine(string.Format("{{Price = {0}}}", price.ToString("C")));