使用字符串插值将字符串转换为大写

Convert string to upper case using string interpolation

我们可以使用字符串插值将字符串转换为大写吗,就像我们在 DateTime 对象中使用它一样:

var str = $"Current date is {DateTime.Now:MM-dd-yyyy}";

在知道culture/localization不重要的情况下,在:之后是否可以传递任何字符串格式修饰符将字符串转换为大写?

P.S。我正在寻找一种无需调用 string.ToUpperToUpperInvariant 方法即可执行此操作的方法,我知道这些方法,并且可以使用它们。

我正在寻找一种 "shorthand" 的方式来做,就像而不是写:

DateTime.Now.ToString("MM-dd-yyyy")

你改为:

$"Current date is {DateTime.Now:MM-dd-yyyy}";

如果有这样的东西那就太棒了:{somekindOfString:U}

鉴于 DateTime.ToString Method documentation,没有。由于您要做的是操作字符串大小写而不是 DateTime 格式,所以这是有道理的。

对于字符串插值快速格式化,您希望要格式化的对象实现 IFormattable 接口,而不是 String 类型。

如前所述,您需要的不是 DateTime 方法,而是字符串方法。

从教学上讲,我会这样做:

string dt = DateTime.Now.ToString("MM-dd-yyyy");
Console.WriteLine($"current date is {dt}".ToUpperInvariant());

如果您想知道为什么使用 UpperInvariant() 而不是 toUpper():

因为我们不会考虑本土文化(In C# what is the difference between ToUpper() and ToUpperInvariant()?)

字符串插值基本上使用 String.Format(...),它使用 FormatHelper,它使用 ... (See MS reference source) 如果你的对象有接口,它使用方法 ToString(string format, IFormatProvider formatProvider) System.IFormattable 已实施。

我写了一个示例应用程序来测试它。

private class MyClass : IFormattable
{
    public string ToString(string format, IFormatProvider formatProvider)
    {
        return "I am called. format: " + format;
    }
}

您可以致电

MyClass mc = new MyClass();
Console.WriteLine($"myclass: {mc:MyParams}");

产生结果

myclass: I am called. format: MyParams

因此,您可以在自定义参数中使用字符串插值,但不能在 System.String-object 中使用它。