string.Format,格式为变量

时间:2018-07-09 08:08:27

标签: c# formatting

我希望能够根据存储在变量中的格式来更改字符串的格式:

DateTime dd = Convert.ToDateTime("2018-6-1");
string.Format(new System.Globalization.CultureInfo("en-GB"),$"{dd:D}").Dump();
string foo = "D";
string.Format(new System.Globalization.CultureInfo("en-GB"), $"{dd}:{foo}").Dump();

在上面的示例中,在第4行,我希望能够以动态格式打印日期-格式存储为变量。

当前,第2行的输出符合预期,是“ 2018年6月1日,星期五”,而第4行的输出是:“ 01/06/2018 0:00:00:D”

有人知道如何解决吗?

谢谢

2 个答案:

答案 0 :(得分:2)

您需要这个:

string.Format(new System.Globalization.CultureInfo("en-GB"), $"{{0:{foo}}}", dd)

插值字符串的计算结果为"{0:D}",请注意如何使用双括号将$""字符串中的单个括号转义。

答案 1 :(得分:1)

您当前的方法不正确。 string.Format的签名如下:

Format(IFormatProvider, String, Object)

就目前而言,您正在击中这个:

Format(IFormatProvider, String, Object[])

为什么?因为您使用的是插值字符串($"")。格式化实际上是在插值字符串内进行的,而不是在Format(...)内进行的,因此文化信息正在丢失,因为插值字符串只是向前传递。

有两种解决方法:

  1. 正确使用Format

    string.Format(new System.Globalization.CultureInfo("en-GB"), $"{{0:{foo}}}", dd).Dump();

    这会将格式评估为“ {0:D}”,然后将其(与区域性一起使用)应用于dd以产生结果。

  2. 在日期对象上使用ToString

    dd.ToString(new System.Globalization.CultureInfo("en-GB"), foo).Dump();