字串格式化三大方式
| 方式 | 語法 | 適用版本 | 特點 |
| 複合格式 | string.Format("{0:C}", val) | 1.0+ | 靜態格式字串、文化特性控制 |
| 插值字串 | $"{val:C}" | C# 6+ | 語法簡潔、編譯期檢查、效能最佳 |
| ToString 格式 | val.ToString("C") | 1.0+ | 單一值、型別專屬格式 |
標準數值格式字串
| 指定項 | 名稱 | 範例 (en-US) | 範例 (zh-TW) |
| C/c | 貨幣 | $123.45 | NT$123.45 |
| D/d | 十進位 (整數) | 00123 | 00123 |
| E/e | 科學記號 | 1.23E+002 | 1.23E+002 |
| F/f | 定點小數 | 123.45 | 123.45 |
| G/g | 一般 | 123.45 | 123.45 |
| N/n | 數字 (含千分位) | 1,234.56 | 1,234.56 |
| P/p | 百分比 | 12.35% | 12.35% |
| X/x | 十六進位 | 7B | 7B |
自訂數值格式字串
// 0: 必填數字位,不足補 0
// #: 選填數字位
// .: 小數點
// ,: 千分位分隔 / 縮放
// %: 乘 100 加 %
// ‰: 乘 1000 加 ‰
// E/e: 科學記號指數部
1234.56.ToString("00000.00") // "01234.56"
1234.56.ToString("##,##0.00") // "1,234.56"
0.1234.ToString("0.00%") // "12.34%"
1234.ToString("#,#,,") // "1" (百萬單位)
日期時間格式字串
DateTime now = DateTime.Now;
// 標準
now.ToString("d") // 短日期 2024/1/15
now.ToString("t") // 短時間 14:30
now.ToString("G") // 一般 2024/1/15 14:30:15
// 自訂
now.ToString("yyyy-MM-dd HH:mm:ss") // 2024-01-15 14:30:15
now.ToString("yyyy年M月d日 dddd") // 2024年1月15日 星期一
對齊與填充 (複合格式/插值通用)
// {index,alignment:format} alignment > 0 右對齊, < 0 左對齊
string.Format("{0,10:N0}", 1234); // " 1,234"
string.Format("{0,-10:N0}", 1234); // "1,234 "
$"{1234,10:N0}" // 右對齊
$"{1234,-10:N0}" // 左對齊
// 表格輸出範例
Console.WriteLine($"{"Name",-15} {"Age",5} {"Score",8:N1}");
foreach (var p in people) {
Console.WriteLine($"{p.Name,-15} {p.Age,5} {p.Score,8:N1}");
}
文化特性控制
var ci = CultureInfo.GetCultureInfo("zh-TW");
string.Format(ci, "{0:C}", 1234.5); // "NT$1,234.50"
// 固定文化特性 (序列化/日誌/網路傳輸)
string.Format(CultureInfo.InvariantCulture, "{0:yyyy-MM-dd}", DateTime.Now);
效能與最佳實務
- 熱路徑優先 插值字串 (編譯為
string.Format 或 DefaultInterpolatedStringHandler 零配置)
- 避免在迴圈中重複
string.Format 相同格式字串,提取為常數
- 大量字串建構用
StringBuilder + AppendFormat
- 序列化/日誌/儲存 強制使用 InvariantCulture




本文對應《叩響 C# 之門》第 2.4 節變數的格式化輸出教學內容