C#中的所有格式控制选项
核心说明
格式控制的通用语法:
$"{变量/表达式:格式符}"
// 示例:
double num = 123.456;
Console.WriteLine($"保留2位小数:{num:F2}"); // 输出:123.46
一、数值类型格式符(整数/浮点数/小数)
适用于 int、double、float、decimal、long 等数值类型,分标准格式符和自定义格式符两类。
1. 标准数值格式符(常用)
| 格式符 | 名称 | 说明 | 示例(输入:1234.5678) |
|---|---|---|---|
| C/c | 货币格式 | 按当前区域显示货币符号(可指定小数位) | {num:C2} → ¥1,234.57(中文环境) |
| D/d | 十进制整数 | 仅适用于整数,指定位数(补前导零) | {123:D5} → 00123 |
| E/e | 科学计数法 | 指数形式(E大写/e小写) | {num:E2} → 1.23E+003 |
| F/f | 固定小数位 | 指定小数位数(四舍五入) | {num:F2} → 1234.57 |
| G/g | 常规格式 | 自动选择最简洁的格式(F/E) | {num:G} → 1234.5678 |
| N/n | 数字格式 | 带千分位,可指定小数位 | {num:N2} → 1,234.57 |
| P/p | 百分比格式 | 数值×100 + %,可指定小数位 | {0.789:P1} → 78.9% |
| X/x | 十六进制 | 仅适用于整数(X大写/x小写) | {255:X} → FF |
| R/r | 往返格式 | 确保浮点数往返解析无丢失(仅double/float) | {0.1:R} → 0.1 |
| O/o | 往返格式 | 同R,优先用于decimal | {0.1m:O} → 0.1 |
2. 自定义数值格式符(灵活拼接)
可自由组合符号,实现自定义格式:
| 符号 | 说明 | 示例 |
|---|---|---|
| 0 | 占位符(补0) | {123.4:0000.00} → 0123.40 |
| # | 占位符(不补0) | {123.4:####.##} → 123.4 |
| . | 小数点 | {123:0.00} → 123.00 |
| , | 千分位/数值缩放 | {123456:0,,} → 123(缩小1000倍) |
| % | 百分比(×100) | {0.78:0.0%} → 78.0% |
| \ | 转义符 | {123:\#0} → #123 |
| ; | 分段符(正/负/零) | { -123:0;负0;零 } → 负123 |
| $ | 货币符号(固定) | {123:$0.00} → $123.00 |
示例:
double num = -1234.5678;
Console.WriteLine($"自定义格式1:{num:0,000.00;-0,000.00;零}"); // -1,234.57
Console.WriteLine($"自定义格式2:{num:#,###.##}"); // -1,234.57
Console.WriteLine($"数值缩放:{1234567:0,,.0}"); // 1234.6(缩小1000倍)
二、日期时间格式符
适用于 DateTime、DateTimeOffset、TimeSpan 类型,分标准格式符和自定义格式符。
1. 标准日期时间格式符(常用)
| 格式符 | 名称 | 说明 | 示例(输入:2026-01-06 10:30:45) |
|---|---|---|---|
| d | 短日期 | 简化日期(年/月/日) | {dt:d} → 2026/1/6 |
| D | 长日期 | 完整日期(含星期) | {dt:D} → 2026年1月6日 星期二 |
| t | 短时间 | 小时:分钟(12/24小时制) | {dt.t} → 10:30 |
| T | 长时间 | 小时:分钟:秒 | {dt:T} → 10:30:45 |
| f | 完整日期+短时间 | 长日期+短时间 | {dt:f} → 2026年1月6日 星期二 10:30 |
| F | 完整日期+长时间 | 长日期+长时间 | {dt:F} → 2026年1月6日 星期二 10:30:45 |
| g | 常规日期+短时间 | 短日期+短时间 | {dt:g} → 2026/1/6 10:30 |
| G | 常规日期+长时间 | 短日期+长时间 | {dt:G} → 2026/1/6 10:30:45 |
| y/Y | 年月格式 | 年+月(Y更完整) | {dt:Y} → 2026年1月 |
| M/m | 月日格式 | 月+日 | {dt:M} → 1月6日 |
| R/r | RFC1123格式 | 标准化日期(用于HTTP) | {dt:R} → Tue, 06 Jan 2026 10:30:45 GMT |
| O/o | 往返格式 | 可解析的完整日期(含时区) | {dt:O} → 2026-01-06T10:30:45.0000000+08:00 |
| s | 排序格式 | 符合ISO 8601,可排序 | {dt:s} → 2026-01-06T10:30:45 |
| u | 通用排序格式 | UTC时间,可排序 | {dt:u} → 2026-01-06 10:30:45Z |
2. 自定义日期时间格式符(灵活拼接)
| 符号 | 说明 | 示例 |
|---|---|---|
| y | 年(1-4位) | {dt:yyyy} → 2026;{dt:yy} → 26 |
| M | 月(1-2位/文本) | {dt:MM} → 01;{dt:MMM} → 一月 |
| d | 日(1-2位) | {dt:dd} → 06;{dt:d} → 6 |
| H | 小时(24制,0-23) | {dt:HH} → 10;{dt:H} → 10 |
| h | 小时(12制,1-12) | {dt:hh} → 10;{dt:h} → 10 |
| m | 分钟(0-59) | {dt:mm} → 30;{dt:m} → 30 |
| s | 秒(0-59) | {dt:ss} → 45;{dt:s} → 45 |
| f | 毫秒(1-7位) | {dt:fff} → 123(取前3位毫秒) |
| tt | 上午/下午(中文:上午/下午) | {dt:tt} → 上午 |
| : | 时间分隔符 | {dt:HH:mm:ss} → 10:30:45 |
| / | 日期分隔符 | {dt:yyyy/MM/dd} → 2026/01/06 |
示例:
DateTime dt = new DateTime(2026, 1, 6, 10, 30, 45, 123);
Console.WriteLine($"自定义日期:{dt:yyyy年MM月dd日 HH:mm:ss.fff}"); // 2026年01月06日 10:30:45.123
Console.WriteLine($"带上午下午:{dt:yyyy-MM-dd hh:mm:ss tt}"); // 2026-01-06 10:30:45 上午
三、TimeSpan 格式符
适用于时间间隔类型(TimeSpan),分标准和自定义:
1. 标准 TimeSpan 格式符
| 格式符 | 说明 | 示例(输入:1天2小时3分4秒) |
|---|---|---|
| c | 常规格式(默认) | {ts:c} → 1.02:03:04 |
| g | 短格式(省略零) | {ts:g} → 1:2:3:4 |
| G | 长格式(补零) | {ts:G} → 01:02:03:04.0000000 |
2. 自定义 TimeSpan 格式符
| 符号 | 说明 | 示例 |
|---|---|---|
| d | 天数 | {ts:d} → 1 |
| h | 小时(12制) | {ts:hh} → 02 |
| H | 小时(24制) | {ts:HH} → 02 |
| m | 分钟 | {ts:mm} → 03 |
| s | 秒 | {ts:ss} → 04 |
| f | 毫秒 | {ts:fff} → 000 |
示例:
TimeSpan ts = new TimeSpan(1, 2, 3, 4);
Console.WriteLine($"自定义TimeSpan:{ts:dd天HH小时mm分钟ss秒}"); // 01天02小时03分钟04秒
四、其他类型格式符
1. 布尔类型(bool)
| 格式符 | 说明 | 示例(输入:true) |
|---|---|---|
| G/g | 常规(True/False) | {b:G} → True |
| F/f | 同G | {b:F} → True |
| D/d | 数字(1/0) | {b:D} → 1 |
2. 枚举类型(enum)
| 格式符 | 说明 | 示例(enum Color { Red=1, Green=2 }) |
|---|---|---|
| G/g | 常规(枚举名称) | {Color.Red:G} → Red |
| D/d | 数字值 | {Color.Red:D} → 1 |
| X/x | 十六进制值 | {Color.Red:X} → 00000001 |
| F/f | 标志枚举(按位组合) | 若枚举加 [Flags],`{Color.Red |
3. Guid 类型
| 格式符 | 说明 | 示例(Guid:6F9619FF-8B86-D011-B42D-00C04FC964FF) |
|---|---|---|
| N | 无分隔符(32位) | {guid:N} → 6f9619ff8b86d011b42d00c04fc964ff |
| D | 带连字符(默认) | {guid:D} → 6F9619FF-8B86-D011-B42D-00C04FC964FF |
| B | 带大括号 | {guid:B} → {6F9619FF-8B86-D011-B42D-00C04FC964FF} |
| P | 带圆括号 | {guid:P} → (6F9619FF-8B86-D011-B42D-00C04FC964FF) |
五、通用注意事项
- 大小写敏感:部分格式符区分大小写(如
E/e科学计数法、X/x十六进制、H/h小时),需按示例使用; - 区域适配:货币(C)、日期(d/D)等格式会受系统区域设置影响(如中文环境显示¥,英文显示$),可指定区域:
// 强制使用英文区域显示货币 Console.WriteLine($"美元格式:{1234.56.ToString("C2", System.Globalization.CultureInfo.GetCultureInfo("en-US"))}"); - 格式符组合:自定义格式符可自由组合(如
yyyy-MM-dd HH:mm:ss),标准格式符不可拼接(如不能写{dt:dT})。
总结
- C# 格式控制符按类型分类:数值、日期时间、TimeSpan、布尔、枚举、Guid,覆盖所有常用类型;
- 格式符分「标准」(简洁,如
C2、d)和「自定义」(灵活,如yyyy-MM-dd),可按需选择; - 核心语法:
{变量:格式符},格式符的效果与ToString(格式符)完全一致,可跨场景复用。
如果需要某类格式的更细节用法(比如精准控制时区、自定义区域格式),可以告诉我,我会补充对应的示例。