前言
ToString("format")、string.Format、Console.WriteLine、插值字串 $"{value:format}" 都依賴 **.NET 格式化字串**。本文整理標準日期/時間、數字格式代碼、自訂格式字元、文化特性影響與實用範例,供快速查閱。
一、標準日期/時間格式 (單一字元)
| 代碼 | 名稱 | 範例 (en-US) | 範例 (zh-TW) | 說明 |
d | 短日期 | 6/15/2023 | 2023/6/15 | DateTimeFormatInfo.ShortDatePattern |
D | 長日期 | Thursday, June 15, 2023 | 2023年6月15日 | LongDatePattern |
t | 短時間 | 3:45 PM | 下午 03:45 | ShortTimePattern |
T | 長時間 | 3:45:30 PM | 下午 03:45:30 | LongTimePattern |
f | 完整日期短時間 | Thursday, June 15, 2023 3:45 PM | 2023年6月15日 下午 03:45 | 長日期 + 短時間 |
F | 完整日期長時間 | Thursday, June 15, 2023 3:45:30 PM | 2023年6月15日 下午 03:45:30 | FullDateTimePattern |
g | 一般日期短時間 | 6/15/2023 3:45 PM | 2023/6/15 下午 03:45 | 短日期 + 短時間 |
G | 一般日期長時間 | 6/15/2023 3:45:30 PM | 2023/6/15 下午 03:45:30 | 短日期 + 長時間 |
M, m | 月日 | June 15 | 6月15日 | MonthDayPattern |
R, r | RFC1123 | Thu, 15 Jun 2023 15:45:30 GMT | 同上 | 固定格式、UTC、不可變 |
s | 可排序 (ISO 8601) | 2023-06-15T15:45:30 | 同上 | SortableDateTimePattern、無時區 |
u | 通用可排序 | 2023-06-15 15:45:30Z | 同上 | UniversalSortableDateTimePattern、UTC |
U | 完整通用日期時間 | Thursday, June 15, 2023 11:45:30 PM | 2023年6月15日 下午 11:45:30 | 轉為 UTC 後套用 F 格式 |
Y, y | 年月 | June 2023 | 2023年6月 | YearMonthPattern |
所有標準格式受 CultureInfo.CurrentCulture 影響。指定文化:dt.ToString("D", new CultureInfo("en-US"))。
二、標準數字格式
| 代碼 | 名稱 | 範例 (1234.56) | 精度說明符 |
C, c | 貨幣 | $1,234.56 / ¥1,234.56 | 小數位數:C2 (預設 2) |
D, d | 十進位 (僅整數) | 0001234 (D8) | 最少位數:D8 左補零 |
E, e | 科學記號 | 1.234560E+003 / 1.234560e+003 | 小數位數:E3 |
F, f | 定點 | 1234.56 (F2) | 小數位數:F3 → 1234.560 |
G, g | 一般 (預設) | 1234.56 | 有效數字:G5 → 1234.6 |
N, n | 數字 (含千分位) | 1,234.56 | 小數位數:N0 → 1,235 |
P, p | 百分比 | 123,456.00% (值乘 100) | 小數位數:P2 |
R, r | 來回 (Round-trip) | 1234.56 (保證 Parse 回相同值) | 忽略精度,Double 17 位、Single 9 位 |
X, x | 十六進位 (僅整數) | 4D2 / 4d2 | 最少位數:X8 → 000004D2 |
預設精度對照 (G 格式)
| 型別 | 預設精度 |
| Byte/SByte | 3 |
| Int16/UInt16 | 5 |
| Int32/UInt32 | 10 |
| Int64/UInt64 | 19 |
| Single | 7 |
| Double | 15 |
| Decimal | 29 |
三、自訂日期/時間格式字元
| 字元 | 意義 | 範例 |
y | 年 (1-2 位) | 23 |
yy | 年 (2 位) | 23 |
yyy | 年 (最少 3 位) | 2023 |
yyyy | 年 (4 位) | 2023 |
M | 月 (1-2 位) | 6 |
MM | 月 (2 位) | 06 |
MMM | 月縮寫 | Jun / 6月 |
MMMM | 月全名 | June / 六月 |
d | 日 (1-2 位) | 15 |
dd | 日 (2 位) | 15 |
ddd | 星期縮寫 | Thu / 週四 |
dddd | 星期全名 | Thursday / 星期四 |
h | 12 小時 (1-2 位) | 3 |
hh | 12 小時 (2 位) | 03 |
H | 24 小時 (1-2 位) | 15 |
HH | 24 小時 (2 位) | 15 |
m | 分 (1-2 位) | 45 |
mm | 分 (2 位) | 45 |
s | 秒 (1-2 位) | 30 |
ss | 秒 (2 位) | 30 |
f~fffffff | 秒小數 (1-7 位) | .5 / .50 / .500... |
t | AM/PM 首字 | P / 午 |
tt | AM/PM 全稱 | PM / 下午 |
K | 時區 | +08:00 / Z |
z | 時區時差 (小時) | +8 |
zz | 時區時差 (小時 2 位) | +08 |
zzz | 時區時差 (時:分) | +08:00 |
: | 時間分隔符 (文化特性) | : |
/ | 日期分隔符 (文化特性) | / |
'text' 或 "text" | 常值字串 | 'Year: 'yyyy → Year: 2023 |
\\ | 跳脫字元 | \\y\\y → yy |
常用自訂格式範例
DateTime now = DateTime.Now; // 2023-06-15 15:45:30.123
now.ToString("yyyy-MM-dd") // 2023-06-15
now.ToString("yyyy/MM/dd HH:mm:ss") // 2023/06/15 15:45:30
now.ToString("yyyy年MM月dd日") // 2023年06月15日
now.ToString("HH:mm:ss.fff") // 15:45:30.123
now.ToString("yyyy-MM-ddTHH:mm:ssK") // 2023-06-15T15:45:30+08:00 (ISO 8601 含時區)
四、自訂數字格式字元
| 字元 | 名稱 | 說明 | 範例 (1234.56) |
0 | 零佔位符 | 該位必須有數字,不足補 0 | 0000.00 → 1234.56 |
# | 數字佔位符 | 有數字顯示,無則留空 | ####.## → 1234.56 |
. | 小數點 | 文化特性決定符號 | 0.00 → 1234.56 |
, | 千分位/縮放 | 每三位分組;連續兩個逗號除以 1,000,000 | #,##0 → 1,234 |
% | 百分比 | 值乘 100 並加 % | 0% → 123456% |
‰ | 千分比 | 值乘 1000 並加 ‰ | 0‰ → 1234560‰ |
E0, E+0 | 指數符號 | 科學記號,E+ 顯示正負號 | 0.00E+0 → 1.23E+3 |
; | 區隔符 | 正數;負數;零 三段格式 | +0;-0;Zero |
'text' | 常值 | 單引號包住字面文字 | '$'0.00 → $1234.56 |
\\ | 跳脫 | 輸出單一字元 | \\#\\# → ## |
區隔符進階:正數;負數;零
double pos = 123, neg = -45, zero = 0;
string fmt = "+0.00;-0.00;[Zero]";
pos.ToString(fmt) // +123.00
neg.ToString(fmt) // -45.00
zero.ToString(fmt) // [Zero]
五、文化特性與 IFormatProvider
var dt = DateTime.Now;
var num = 1234.56;
dt.ToString("D", new CultureInfo("en-US")); // Thursday, June 15, 2023
dt.ToString("D", new CultureInfo("zh-TW")); // 2023年6月15日
dt.ToString("D", CultureInfo.InvariantCulture); // 固定美式格式
num.ToString("C", new CultureInfo("zh-TW")); // NT$1,234.56
num.ToString("C", new CultureInfo("en-US")); // $1,234.56
num.ToString("C", CultureInfo.InvariantCulture); // ¤1,234.56 (通用貨幣符號)
六、實用組合範例
// Log 時間戳
$"{DateTime.Now:yyyy-MM-dd HH:mm:ss.fff} [INFO] Service started"
// 檔案名稱安全時間
$"backup_{DateTime.Now:yyyyMMdd_HHmmss}.bak"
// 金額顯示 (台幣)
$"{amount:N0} 元" // 1,234 元
$"{amount:C0}" // NT$1,234
// 百分比進度
$"{progress:P1}" // 56.7%
// 十六進位位址
$"0x{address:X8}" // 0x00401000
// 固定寬度對齊 (配合 PadLeft)
$"{id:D5}" // 00123
七、常見錯誤
| 錯誤寫法 | 正確寫法 | 原因 |
ToString("YYYY-MM-DD") | ToString("yyyy-MM-dd") | 大寫 Y/D 非標準自訂字元 |
ToString("MM/DD/YYYY") | ToString("MM/dd/yyyy") | dd=日,DD 無意義 |
ToString("#,###.##") | ToString("#,##0.##") | 個位數需用 0 保證顯示 |
ToString("P") 傳入 0.56 期望 56% | 傳入 0.56 即得 56.00% (已乘 100) | P 格式會自動乘 100 |
string.Format("{0:C}", 123) 無貨幣符號 | 指定 CultureInfo | InvariantCulture 顯示 ¤ |
總結
掌握 **標準格式 (單一字元)** 解決 80% 需求,**自訂格式字元** 處理剩餘 20% 精細控制。記住:yyyy-MM-dd、HH:mm:ss、N2、C2、P1、X8 是最常用組合。指定 CultureInfo 確保跨環境一致性。