--- tags: C# , Language --- # String Interpolation & 格式化整理 ## 前言 - String Interpolation 讓字串插入某些「特定字」. 可用來取代 String.Format , String Interpolation 比 String.Format 讓我們更容易表示愈顯示的字串格式. - 差異 - String.Format 的使用是 string.Format("{0} 的年齡是 {1}", name, age)) , 先佔位後 , 再輸入變數. - 但 string interpolation 則可以直接將變數放入佔位處 , 像是 - $"{name} 的年齡是 {age}" - String.Format 變數位置擺的位置比較不直覺 , 所以位置順率可能會擺錯. - $ 編譯後與 String.Format 編譯後相等 - 簡單範例 ```C# string name = "City"; int age = 18; double weight = 62.1; // # old vs new Console.WriteLine("# old vs new "); Console.WriteLine(string.Format("{0} 的年齡是 {1}", name, age)); // old Console.WriteLine($"{name} 的年齡是 {age}"); // new Console.WriteLine(); // # 格式化字串 Console.WriteLine("# 格式化字串"); // old Console.WriteLine("## 舊的寫法"); Console.WriteLine(string.Format("{0} 的體重是 {1:##.000}", name, weight)); Console.WriteLine($"日期時間 {DateTime.Now: yyyy/MM/dd HH:mm:ss}"); Console.WriteLine(string.Format("{0,20} - 圓周率", Math.PI)); Console.WriteLine(string.Format("|{0,-10}|{1,10}|", "靠左對齊", "靠右對齊")); // new Console.WriteLine("\n## 新的寫法"); Console.WriteLine($"{name} 的體重是 {weight:##.000}"); Console.WriteLine($"日期時間 {DateTime.Now:yyyy/MM/dd HH:mm:ss}"); Console.WriteLine($"{Math.PI,20} - 圓周率"); Console.WriteLine($"|{"靠左對齊",-10}|{"靠右對齊",10}|"); Console.WriteLine(); //逐字解譯字串常值 Console.WriteLine("# 逐字解譯字串常值"); Console.WriteLine($@"\ABC\DEF"); Console.WriteLine($@"\ABC\DEF {age} \n"); // 仍然可以插入變數 ``` ```C# /// 輸出結果 # old vs new City 的年齡是 18 City 的年齡是 18 # 格式化字串 ## 舊的寫法 City 的體重是 62.100 日期時間 2020/05/31 14:20:04 3.141592653589793 - 圓周率 |靠左對齊 | 靠右對齊| ## 新的寫法 City 的體重是 62.100 日期時間 2020/05/31 14:20:04 3.141592653589793 - 圓周率 |靠左對齊 | 靠右對齊| # 逐字解譯字串常值 \ABC\DEF \ABC\DEF 18 \n ``` ## 常見的數值格式 ### 貨幣 ```C# // $"{ 2:C1}" 要加空白 , 不然似乎會解析錯誤 Console.WriteLine($"{ 2:C1}"); // C1 代表為 2 後面補1個零 Console.WriteLine($"{ 2:C3}"); // C3 代表為 2 後面補3個零 Console.WriteLine($"{ 2:C6}"); // C6 代表為 2 後面補6個零 NT$2.0 NT$2.000 NT$2.000000 ``` ### 十進制 Decimal - 帶選擇性負號的整數位數 ```C# Console.WriteLine($"{ 2:D1}"); // 有1個數字 , 若不夠 , 前面補零 Console.WriteLine($"{ 2:D3}"); // 有3個數字 , 若不夠 , 前面補零 Console.WriteLine($"{ 2:D6}"); // 有6個數字 , 若不夠 , 前面補零 Console.WriteLine($"{-2:D6}"); // 有6個數字 , 若不夠 , 前面補零 2 002 000002 -000002 ``` ### 指數標記 ```C# Console.WriteLine($"{12345.6789:E}"); //預設小點後六點 , 四捨五入 Console.WriteLine($"{12345.6789:E4}"); // 小數點後四位 , 四捨五入 Console.WriteLine($"{12345.6789:E10}"); // 小數點後十位 , 可能補零 1.234568E+004 1.2346E+004 1.2345678900E+004 ``` ### 用分號隔開的數字 ```C# Console.WriteLine($"{250000.1:N0}"); // 沒有小數 Console.WriteLine($"{250000.1:N}"); // 預設小數點後兩位 Console.WriteLine($"{250000.1:N3}"); // 小數點後三位 Console.WriteLine($"{250000.1:N6}"); // 小數點後六位 250,000 250,000.10 250,000.100 250,000.100000 ``` ### 十六進制 ```C# Console.WriteLine($"{0x1E:X}"); // 預設1個佔位數字 Console.WriteLine($"{0x1E:X1}"); // 1個佔位數字 Console.WriteLine($"{0x1E:X3}"); // 3個佔位數字 , 可補零 Console.WriteLine($"{ 30:X1}"); // 1個佔位數字 Console.WriteLine($"{ 30:X3}"); // 3個佔位數字 , 可補零 Console.WriteLine($"{ 30:X6}"); // 6個佔位數字 , 可補零 1E 1E 01E 1E 01E 00001E ``` ### 格式化百分比 ```C# Console.WriteLine($"{-0.24583:P}"); // 預設小數點後兩位 , 四捨五入 Console.WriteLine($"{-0.2458:P1}"); // 小數點後一位 , 四捨五入 Console.WriteLine($"{-0.24583:P3}"); // 小數點後3位 , 四捨五入 Console.WriteLine($"{0.2458:P}"); Console.WriteLine($"{0.24583:P1}"); Console.WriteLine($"{0.24583:P3}"); Console.WriteLine($"{10.3:P}"); Console.WriteLine($"{10.3:P1}"); Console.WriteLine($"{10.3:P3}"); -24.58% -24.6% -24.583% 24.58% 24.6% 24.583% 1,030.00% 1,030.0% 1,030.000% ``` ## 自訂數值格式字串 ### 零預留位置符號 "0" - 預留數字位置補零 , 但若變數無該位置 , 則補零 e.g. 1 vs 000 , 輸出 001 - 四捨五入 ```C# var num = 123; Console.WriteLine($"{num:0}"); // 預留一個 0 的位置 Console.WriteLine($"{num:000}"); // 預留三個 0 的位置 Console.WriteLine($"{num:00000}"); // 預留五個 0 的位置 Console.WriteLine($"{1.2378:0.0}"); // 預留個位數以及小數點後一個數字 Console.WriteLine($"{1.2378:0.00}"); Console.WriteLine($"{1.2378:00.00}"); 123 123 00123 1.2 1.24 01.24 ``` ### 數字預留位置符號 "#" - 預留數字位置 , 但若變數無該位置 , 則忽略 e.g. 1 vs ### , 依然輸出 1 - 四捨五入 ```C# var num = 123; Console.WriteLine($"{num:#}"); // 預留一個數字的位置 Console.WriteLine($"{num:###}"); // 預留三個數字的位置 Console.WriteLine($"{num:#####}"); // 預留五個數字的位置 Console.WriteLine($"{1.2378:###.#}"); Console.WriteLine($"{1.2378:###.##}"); 123 123 123 1.2 1.24 ``` ### 客製化電話格式 ```C# var phone = 0229007657; Console.WriteLine($"{phone:(0#) ########}"); Console.WriteLine($"{phone:區域號碼是 (0#) 電話是 ########}"); (02) 29007657 區域號碼是 (02) 電話是 29007657 ``` ## 總結 - 使用此語法時 , $ 和 "" 中間不能有空白 , 不然編譯會發生問題. - 要顯示「{}」時 , 使用雙大括號 , 意即要輸入「{{」和「}}」才能正常顯示「{」和「}」. - 例如:$"Name is={{name}}" --> Name is={name}. - 當要使用三元運算式時 , 要使用「()」包起來. - var name = "王大明"; - 例如:$"Name is=[{(name.Length > 2 ? "周論發" : name)}]" --> Name is=[周論發]. - C# 8.0 以前 , 若是需要同時使用 $ , @ 兩個符號. $ 要在 @ 的前面 ## 參考 [標準數值格式字串](https://docs.microsoft.com/zh-tw/dotnet/standard/base-types/standard-numeric-format-strings) [C# 中的字串插補](https://docs.microsoft.com/zh-tw/dotnet/csharp/tutorials/string-interpolation) [自訂數值格式字串](https://docs.microsoft.com/zh-tw/dotnet/standard/base-types/custom-numeric-format-strings) [自訂日期與時間格式字串](https://docs.microsoft.com/zh-tw/dotnet/standard/base-types/custom-date-and-time-format-strings) ### Thank you! You can find me on - [GitHub](https://github.com/s0920832252) - [Facebook](https://www.facebook.com/fourtune.chen) 若有謬誤 , 煩請告知 , 新手發帖請多包涵 # :100: :muscle: :tada: :sheep: