C#字符串插值,格式可变

时间:2015-09-03 19:50:20

标签: c#

我需要使用字符串插值格式化变量,格式字符串是另一个变量:

这是我的示例代码:

static void Main(string[] args)
{
    int i = 12345;

    Console.WriteLine($"Test 1: {i:N5}");

    var formatString = "N5";

    Console.WriteLine($"Test 2: {i:formatString}");
}

测试1起作用,测试2不起作用。

测试2的确切语法是什么?

6 个答案:

答案 0 :(得分:4)

您的代码相当于:

Console.WriteLine(String.Format("Test 2: {0:formatString}", i));

由于formatString在格式字符串中,您将嵌套String.Format调用以将值放入格式字符串中:

Console.WriteLine(String.Format(String.Format("Test 2: {{0:{0}}}", formatstring), i));

字符串插值不支持此功能。

答案 1 :(得分:2)

C#没有能够达到你想要的语法。

答案 2 :(得分:2)

你能做到这一点的最短路径'语法上'没有String.Format,正在使用ToString

$"Test 2: {i.ToString(formatString)}"

答案 3 :(得分:0)

字符串插值在编译阶段发生。因此,您无法在格式字符串中使用变量。

答案 4 :(得分:0)

我已经测试了这段代码,似乎有效:

static void Main(string[] args)
{
    int i = 12345;

    Console.WriteLine("Test 1: {0:N5}",i);

    var formatString = "N5";

    Console.WriteLine("Test 2: {0:" + formatString + "}", i);

    Console.ReadLine();
}

答案 5 :(得分:0)

您可以创建一个简单的扩展方法,该扩展方法允许您在任何对象上调用格式表ToStringIFormattable接口与string.Format或内插字符串用于格式化未知类型的对象的方式相同。

public static string ToString(this object value, string format, IFormatProvider provider = null)
    => (value as IFormattable)?.ToString(format, provider) ?? value.ToString();

要使用:

object i = 12345;
var formatString = "N5";

Console.WriteLine($"Test 2: {i.ToString(formatString)}");