上一節我們學習了字串佔位符,並認識兩種寫法。事實上除了這兩種方式以外,C# 還支援更進階、規則更複雜的格式化語法。
基礎格式佔位符語法
{索引,對齊方式:格式規格}
1、index(索引)
索引 / 內插變數,必填參數
傳統數字佔位符寫法:Console.WriteLine(“{0}”, 123); 代表在 {0} 的位置填入數值 123
字串內插 $"":可直接寫變數名稱,不需要數字索引,範例 Console.WriteLine($”Tom is {age} years old”)
範例程式
int money = 1000;
Console.WriteLine("原始數值:{0}", money);
Console.WriteLine("貨幣格式:{0:C}", money);
Console.WriteLine("靠右對齊10字元寬度貨幣:|{0,10:C}|", money);Code language: JavaScript (javascript)
原始數值:1000
貨幣格式:$1,000.00
靠右對齊10字元寬度貨幣:| $1,000.00|
內插語法對應寫法
int money = 500;
Console.WriteLine($"原始數值:{money}");
Console.WriteLine($"貨幣格式:{money:C}");
Console.WriteLine($"靠右對齊10字元寬度貨幣:|{money,10:C}|");Code language: JavaScript (javascript)
2、alignment(對齊設定)
對齊描述符,選填,以逗號 , 隔開
用途:控制輸出的最小字元寬度以及左右對齊模式
舉例:Console.WriteLine(“{0,10}”, 123); // 佔滿10個字元空間,數字靠右排列

可以看見 123 左側有大量空白,這裡的 10 代表總共配置10個字元位置,也就是 123 左邊會補上7個空白字元,達成靠右對齊效果。
正數:靠右對齊,寬度不足時左側補空白 範例:{0,10} → 佔10字元寬,數字靠右
負數:靠左對齊,寬度不足時右側補空白 範例:{0,-10} → 佔10字元寬,數字靠左
我們修改程式如下
Console.WriteLine("{0,-10}", 123); // 占用10個字元,負數代表數字靠左對齊Code language: JavaScript (javascript)

單純數字不易分辨空白,我們加上豎線區隔空白方便觀察
Console.WriteLine("|{0,-10}|", 123);
Console.WriteLine("|{0,10}|", 456);Code language: JavaScript (javascript)

加上前後豎線後就能一目了然:數字10代表固定10字元寬度,負數靠左、正數靠右,不足的位置自動補空白。
改用字串內插語法的對應寫法如下
int one = 123;
int two = 456;
Console.WriteLine($"|{one,-10}|");
Console.WriteLine($"|{two,-10}|");Code language: JavaScript (javascript)

3、format(格式標記)
格式欄位,選填,使用冒號 : 與前半部隔開
用來控制數字顯示樣式:貨幣、小數點、科學記號、十六進位等等
格式欄位結構 :Axx
:必須緊貼佔位符,中間不能有空白A:單字母格式符(共9種內建標準格式,部分區分大小寫)xx:精準度參數(選填,1~2位數字,作用隨格式符改變)
// F4:定點小數格式,保留四位小數
Console.WriteLine("{0:F4}", 12.345678);
// 內插語法對應寫法
Console.WriteLine($"{12.345678:F4}");Code language: JavaScript (javascript)

再多看幾個示範
double myDouble = 12.345678;
Console.WriteLine("{0,-10:G} -- 通用格式", myDouble); // 12.345678 -- 通用格式
Console.WriteLine("{0,-10} -- 預設格式", myDouble); // 12.345678 -- 預設格式
Console.WriteLine("{0,-10:F4} -- 定點小數", myDouble); // 12.3457 -- 定點小數
Console.WriteLine("{0,-10:C} -- 貨幣格式", myDouble); // $12.35 -- 貨幣格式
Console.WriteLine("{0,-10:E3} -- 科學記號", myDouble);//1.235E+001 -- 科學記號
Console.WriteLine("{0,-10:x} -- 十六進位整數", 1194719); // 123adf -- 十六進位整數Code language: JavaScript (javascript)
9 種標準數字格式符對照表
| 標記 | 名稱 | 功能 | 精準度含義 | 範例輸出 |
|---|---|---|---|---|
| C/c | Currency 貨幣 | 自動加上在地貨幣符號 | 小數位數 | {0:C} 12.5 → $12.50 |
| D/d | Decimal 十進位整數 | 僅適用整數,不足位數補前導零 | 最少顯示位數 | {0:D4} 12 → 0012 |
| F/f | Fixed-point 定點小數 | 固定小數位數 | 保留的小數位數 | {0:F4} 12.345678 →12.3457 |
| G/g | General 通用格式 | 自動切換定點/科學記號,系統預設格式 | 有效位數 | {0:G4} 12.345678 →12.35 |
| X/x | Hexadecimal 十六進位(區分大小寫) | 輸出十六進位,X大寫、x小寫 | 最少顯示位數 | {0:x} 180026 → 2bf3a |
| N/n | Number 千分位數字 | 數字每三位加分隔符 | 小數位數 | {0:N2} 12345678.54321 →12,345,678.54 |
| P/p | Percent 百分比 | 數值乘以100並加上%符號 | 小數位數 | {0:P2} 0.1221897 →12.22 % |
| R/r | Round-trip 往返格式 | 格式化後可完整還原原始數值不丟失精度 | 忽略精準度參數 | {0:R} 1234.21897 →1234.21897 |
| E/e | Scientific 科學記號(區分大小寫) | 科學計數法,E大寫/e小寫 | 尾數保留小數位 | {0:e4}12.3456789 →1.2346e+001 |