假设:
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}}}");
按预期工作,但有额外的空间。我可以连接尾部支架,我认为这是一个穷人的解决方案。有口语富人的解决方案吗?感谢。
答案 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")));