我们前一节学习了字符串占位符,学习了两种方式,其实除了这两种方式,C#还支持更复杂的格式化规则的。
基础格式占位符语法
{index,alignment:format}
1、index
索引 / 插值变量,必填
传统的数字占位符:Console.WriteLine(“{0}”, 123); 就是在{0}插入123
字符串插值$"":直接写变量名,无需数字索引,例如 Console.WriteLine($”Tom is {age} years old”)
例子
nt money = 1000;
Console.WriteLine("原值:{0}", money);
Console.WriteLine("货币:{0:C}", money);
Console.WriteLine("右对齐10位货币:|{0,10:C}|", money);Code language: C# (cs)
原值: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: C# (cs)
2、alignment
对齐说明符,可选,逗号,分隔
作用:控制输出最小字符宽度与左右对齐
例如:Console.WriteLine(“{0,10}”, 123); //占 10 字符宽度,数字靠右

我们看到,123的左边有很多空白,这里的10,就是占十个字符串,也就是123的左边其实是7个空白字符,这样就达到了靠右对齐。
正数:右对齐,不足宽度左侧补空格 例:{0,10} → 占 10 字符宽度,数字靠右
负数:左对齐,不足宽度右侧补空格 例:{0,-10} → 占 10 字符宽度,数字靠左
比如我们改为
Console.WriteLine("{0,-10}", 123); //占 10 字符宽度,负数,所以数字靠左Code language: C# (cs)

读者可能看不出效果,为了区分空白,我们可以这样
Console.WriteLine("|{0,-10}|", 123);
Console.WriteLine("|{0,10}|", 456);Code language: C# (cs)

像以上这样,读者就很清晰了,这里的10就是占10个字符,负数是靠左,正数是靠右,左右不够的补空格。
如果用插值的方式,等价于下面
int one = 123;
int two = 456;
Console.WriteLine($"|{one,-10}|");
Console.WriteLine($"|{two,-10}|");Code language: C# (cs)

3、format
格式字段,可选,冒号:分隔
控制数字显示类型(货币、小数、科学计数、十六进制等)
格式字段结构 :Axx
:必须紧贴占位符,无空格A:单字母格式说明符(9 种内置标准格式,大小写部分区分)xx:精度说明符(可选,1~2 位数字,含义随格式符变化)
// F4:定点格式,保留4位小数
Console.WriteLine("{0:F4}", 12.345678);
// 插值等价写法
Console.WriteLine($"{12.345678:F4}");Code language: C# (cs)

继续看例子
double myDouble = 12.345678;
Console.WriteLine("{0,-10:G} -- General", myDouble); // 12.345678 -- General
Console.WriteLine("{0,-10} -- Default", myDouble); // 12.345678 -- Default
Console.WriteLine("{0,-10:F4} -- Fixed Point", myDouble); // 12.3457 -- Fixed Point
Console.WriteLine("{0,-10:C} -- Currency", myDouble); // $12.35 -- Currency
Console.WriteLine("{0,-10:E3} -- Sci. Notation", myDouble);//1.235E+001 -- Sci. Notation
Console.WriteLine("{0,-10:x} -- Hex integer", 1194719); // 123adf -- Hex integerCode language: C# (cs)
9 种标准数字格式说明符对照表
| 标识 | 名称 | 作用 | 精度含义 | 示例 |
|---|---|---|---|---|
| C/c | Currency 货币 | 带本地货币符号 | 小数位数 | {0:C} 12.5 → $12.50 |
| D/d | Decimal 十进制整数 | 仅 int 类型,补前导 0 | 最少数字位数 | {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 |