在做法 4 中,介紹了字串插值的寫法,但是某些功能需要根據不同的文化產生不同的結果,例如時間輸出的格式就會根據目前電腦的文化設定來輸出時間。
Console.WriteLine(CultureInfo.CurrentCulture);
var time1 = $"{DateTime.Now}";
Console.WriteLine(time1);
zh-TW
2024/9/27 下午 05:31:38
這裡直接設定 CultureInfo 可以將目前環境切換成 en-us
CultureInfo.CurrentCulture = new CultureInfo("en-us");
Console.WriteLine(CultureInfo.CurrentCulture);
var time2 = $"{DateTime.Now}";
Console.WriteLine(time2);
en-US
9/27/2024 5:37:04 PM
除了直接調整 CultureInfo 也可以將字串改宣告成 FormattableString 而不是 string。 這個類型也很好理解,主要就是透過 Format 屬性取得字串的格式和 GetArguments 方法取得傳入的參數,最後就可以使用 String.Format 來格式化字串。
FormattableString time3 = $"Current Time: {DateTime.Now.ToString()}";
Console.WriteLine(time3.Format);
Console.WriteLine(time3.GetArguments());
Console.WriteLine(time3);
Current Time: {0}
2024/9/27 下午 05:59:51
Current Time: 2024/9/27 下午 06:04:47
例如我們可以寫一個方法只要輸入 FormattableString 就能轉成德文格式的字串。
public static string ToGerman(FormattableString src)
{
return string.Format(CultureInfo.CreateSpecificCulture("de-de"),
src.Format,
src.GetArguments());
}
Console.WriteLine(ToGerman(time3));
Current Time: 27.09.2024 18:06:54
Summary
這個做法是用來補充說明字串插值的寫法,從結果可以知道背後還是要使用 string.Format 來轉換字串的文化,其實就跟我們自己寫 string.Format 是差不多的意思,但是選擇字串插值的寫法可以輸出 string 或者 FormattableString,有需要處理文化就輸出 FormattableString, 不需要的話也可以直接輸出 string,所以選擇類型是根據我們的需求來選的,這個做法主要就是在介紹使用字串插值彈性比較高,直接使用 string.Format 是沒辦法輸出 FormattableString。