【问题标题】:String interpolation C#: Documentation of colon and semicolon functionality字符串插值 C#:冒号和分号功能的文档
【发布时间】:2018-12-20 16:56:16
【问题描述】:

我为 FizzBu​​zz 测试找到了这个 codegolf 答案,经过一番检查后,我意识到我不知道它实际上是如何工作的,所以我开始调查:

for(int i=1; i<101;i++)
    System.Console.Write($"{(i%3*i%5<1?0:i):#}{i%3:;;Fizz}{i%5:;;Buzz}\n");

我把它放入 dotnetfiddle 并建立了第一部分的工作如下:

{(BOOL?0:i):#}

当 BOOL 为真时,条件表达式返回 0,否则返回数字。

但是除非是&lt;&gt; 0,否则不会返回该号码。我猜这是:# 字符的工作。我找不到关于 :# 字符工作的任何文档。谁能解释冒号/哈希或指出正确的方向吗?

第二部分:

{VALUE:;;Fizz}

VALUE = 0 时,不会打印任何内容。我假设这是由第一个 ; 字符 [结束语句] 确定的。第二个; 字符确定'如果VALUE &lt;&gt; 0 然后打印我之后的内容。'

再一次,有没有人有关于在字符串插值中使用 分号 的文档,因为我找不到任何有用的东西。

【问题讨论】:

  • what other 'advanced' functionality exists in string interpolation that I may not be aware of? 太宽泛了,您应该删除它
  • 冒号 : 后面的任何内容都只是一个普通的老式简单格式字符串 (docs.microsoft.com/en-us/dotnet/standard/base-types/…)。 (当然不包括三元 inline-if 运算符 condition ? exprA : exprB 的冒号)
  • @elgonzo - 就是这样,但没有?在第一部分或第二部分的冒号前标记。
  • 对于您的;;,请参阅String Formatting

标签: c# syntax string-interpolation


【解决方案1】:

这在String Interpolation documentation 中都有介绍,尤其是Structure of an Interpolated String 部分,其中包括:

{<interpolatedExpression>[,<alignment>][:<formatString>]}

以及这三个部分的更详细说明。

该结构的格式字符串部分在单独的页面上定义,您可以在其中对数字类型使用 standardcustom 格式,对日期和时间类型使用 standardcustom 格式。还有Enum values的选项,你甚至可以创建自己的custom format provider

值得查看自定义格式提供程序文档,因为它还会引导您使用 FormattableString 类型。文档没有很好地涵盖这一点,但我的理解是这种类型理论上可能允许您避免在循环中使用时为每次迭代重新解析插值字符串,从而有可能提高性能(尽管在实践中,此时没有区别)。我有 written about this before,我的结论是 MS 需要以更好的方式将其构建到框架中。

【讨论】:

    【解决方案2】:

    感谢所有评论者!快速响应。

    # 在这里定义(自定义说明符)

    https://docs.microsoft.com/en-us/dotnet/standard/base-types/custom-numeric-format-strings#the--custom-specifier

    “#”自定义格式说明符用作数字占位符符号。 如果正在格式化的值的位置有一个数字 “#”符号出现在格式字符串中,该数字被复制到 结果字符串。否则,没有任何内容存储在该位置 结果字符串。请注意,此说明符从不显示零 不是有效数字,即使零是唯一的数字 细绳。只有当它是有效数字时才会显示零 正在显示的数字。

    ;在这里定义(Section Seperator):

    https://docs.microsoft.com/en-us/dotnet/standard/base-types/custom-numeric-format-strings#the--section-separator

    分号 (;) 是适用的条件格式说明符 数字的不同格式取决于其值是否为 正、负或零。为了产生这种行为,一个自定义格式 字符串最多可以包含三个由分号分隔的部分...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-17
      • 2017-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-07
      • 1970-01-01
      相关资源
      最近更新 更多