簡體   English   中英

具有可變格式的 C# 字符串插值

[英]C# string interpolation with variable format

我需要用字符串插值格式化一個變量,格式字符串是另一個變量:

這是我的示例代碼:

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 無效。

Test 2 的確切語法是什么?

您的代碼相當於:

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

由於formatString在格式字符串中,您可以嵌套String.Format調用以將值放入格式字符串中:

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

字符串插值不支持此操作。

在沒有 String.Format 的情況下,您可以在“語法上”執行此操作的最短方法是使用ToString

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

C# 沒有可以做你想做的事的語法。

字符串插值發生在編譯階段。 因此,您不能在格式字符串中使用變量。

我已經測試了這段代碼,它似乎有效:

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();
}

您可以創建一個簡單的擴展方法,允許您在任何對象上調用可格式化的ToString方法。 IFormattable接口與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)}");

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM