核心说明

格式控制的通用语法:

$"{变量/表达式:格式符}"
// 示例:
double num = 123.456;
Console.WriteLine($"保留2位小数:{num:F2}"); // 输出:123.46

一、数值类型格式符(整数/浮点数/小数)

适用于 intdoublefloatdecimallong 等数值类型,分标准格式符自定义格式符两类。

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倍)

二、日期时间格式符

适用于 DateTimeDateTimeOffsetTimeSpan 类型,分标准格式符自定义格式符

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)

五、通用注意事项

  1. 大小写敏感:部分格式符区分大小写(如 E/e 科学计数法、X/x 十六进制、H/h 小时),需按示例使用;
  2. 区域适配:货币(C)、日期(d/D)等格式会受系统区域设置影响(如中文环境显示¥,英文显示$),可指定区域:
    // 强制使用英文区域显示货币
    Console.WriteLine($"美元格式:{1234.56.ToString("C2", System.Globalization.CultureInfo.GetCultureInfo("en-US"))}");
    
  3. 格式符组合:自定义格式符可自由组合(如 yyyy-MM-dd HH:mm:ss),标准格式符不可拼接(如不能写 {dt:dT})。

总结

  1. C# 格式控制符按类型分类:数值、日期时间、TimeSpan、布尔、枚举、Guid,覆盖所有常用类型;
  2. 格式符分「标准」(简洁,如 C2d)和「自定义」(灵活,如 yyyy-MM-dd),可按需选择;
  3. 核心语法:{变量:格式符},格式符的效果与 ToString(格式符) 完全一致,可跨场景复用。

如果需要某类格式的更细节用法(比如精准控制时区、自定义区域格式),可以告诉我,我会补充对应的示例。