"{ N [, M ][: formatString ]}", arg1, ... argN}
在这个格式中:
1) N是从0开始的整数,表示要格式化的参数的个数
2) M是一个可选的整数,决定了格式化字符串的宽度和对齐方向:表示格式化后的参数所占的宽度,如果M是负数,那么格式化后的值就是左对齐的,如果M是正数,那么格式化后的值是右对齐的
3) formatString是另外一个可选的参数,决定了如何格式化数据,比如用货币符号,科学计数法或者16进制。表示格式代码argN表示要格式化的表达式,和N是对应的。如果argN是空值,那么就用一个空字符串来代替。如果没有formatString,那么就用参数N对应的ToString方法来格式化。下面的语句会产生同样的输出:
publicclassTestConsoleApp
{
publicstaticvoidMain(string[]args)
{
Console.WriteLine(123);
Console.WriteLine("{0}",123);
Console.WriteLine("{0:D3}",123);
}
}
格式标识符号共有9种,它们代表了大多数常用的数字格式。就像下表所示:
字母 | 含义 |
C 或c | Currency 货币格式 |
D或d | Decimal 十进制格式(十进制整数,不要和.Net的Decimal数据类型混淆了) |
E或e | Exponent 指数格式 |
F或f | Fixed point 固定精度格式 |
G 或g | General 常用格式 |
N或n | 用逗号分割千位的数字,比如1234将会被变成1,234 |
P或p | Percentage 百分符号格式 |
R 或r | Round-trip 圆整(只用于浮点数)保证一个数字被转化成字符串以后可以再被转回成同样的数字 |
X 或x | Hex 16进制格式 |
如果我们使用下面的表达方式,让我们看看会发生什么
publicclassFormatSpecApp
{
publicstaticvoidMain(string[]args)
{
inti=123456;
Console.WriteLine("{0:C}",i);//¥123,456.00
Console.WriteLine("{0:D}",i);//123456
Console.WriteLine("{0:E}",i);//1.234560E+005
Console.WriteLine("{0:F}",i);//123456.00
Console.WriteLine("{0:G}",i);//123456
Console.WriteLine("{0:N}",i);//123,456.00
Console.WriteLine("{0:P}",i);//12,345,600.00%
Console.WriteLine("{0:X}",i);//1E240
}
}
精度控制标识控制了有效数字的个数或者十进制数小数的位数。
Console.WriteLine(" {0:C5}",i);//¥123,456.00
Console.WriteLine("{0:D5}",i);//123456
Console.WriteLine("{0:E5}",i);//1.23456E+005
Console.WriteLine("{0:F5}",i);//123456.00000
Console.WriteLine("{0:G5}",i);//1.23456E5
Console.WriteLine("{0:N5}",i);//123,456.00000
Console.WriteLine("{0:P5}",i);//12,345,600.00000%
Console.WriteLine("{0:X5}",i);//1E240
如果标准格式化标识符还不能满足你。你可以使用图形化格式字符串来创建定制的字符串输出。图形化格式化使用占位符来表示最小位数,最大位数,定位符号,负号的外观以及其它数字符号的外观。就像下表所示
符号 | 名称 | 含义 |
0 | 0 占位符 | 用0填充不足的位数 |
# | 数字占位符 | 用#代替实际的位数 |
. | 十进制小数点 | |
, | 千位分隔符 | 用逗号进行千位分割,比如把 1000分割成1,000 |
% | 百分符号 | 显示一个百分标识 |
E+0E-0e+0e-0 | 指数符号 | 用指数符号格式化输出 |
专一字符 | 用于传统格式的格式化序列,比如"n"(新行) | |
'ABC'"ABC" | 常量字符串 | 显示单引号或者双引号里面的字符串 |
; | 区域分隔符 | 如果数字会被格式化成整数,负数,或者0,用;来进行分隔 |
,. | 缩放符号 | 数字除以1000 |
看下面的例子:
doublei=123456.42;
Console.WriteLine();
Console.WriteLine("{0:000000.00}",i);//123456.42
Console.WriteLine("{0:00.00000000e+0}",i);//12.34564200e+4
Console.WriteLine("{0:0,.}",i); //123
Console.WriteLine("{0:#0.000}",i); //123456.420
Console.WriteLine("{0:#0.000;(#0.000)}",i); //123456.420
Console.WriteLine("{0:#0.000;(#0.000);<zero>}",i);//123456.420
Console.WriteLine("{0:#%}",i); //12345642%
i=-123456.42;
Console.WriteLine();
Console.WriteLine("{0:000000.00}",i);//-123456.42
Console.WriteLine("{0:00.00000000e+0}",i);//-12.34564200e+4
Console.WriteLine("{0:0,.}",i); //-123
Console.WriteLine("{0:#0.000}",i); //-123456.420
Console.WriteLine("{0:#0.000;(#0.000)}",i); //(123456.420)
Console.WriteLine("{0:#0;(#0);<zero>}",i);//(123456)
Console.WriteLine("{0:#%}",i); //-12345642%
i=0;
Console.WriteLine();
Console.WriteLine("{0:0,.}",i); //0
Console.WriteLine("{0:#0}",i); //0
Console.WriteLine("{0:#0;(#0)}",i); //0
Console.WriteLine("{0:#0;(#0);<zero>}",i);//<zero>
Console.WriteLine("{0:#%}",i); //%
日期格式化
D | ||
D | MM/dd/yyyy | ShortDatePattern(短日期模式) |
D | dddd,MMMM dd,yyyy | LongDatePattern(长日期模式) |
F | dddd,MMMM dd,yyyy HH:mm | Full date and time (long date and short time)(全日期和时间模式) |
F | dddd,MMMM dd,yyyy HH:mm:ss | FullDateTimePattern (long date and long time)(长日期和长时间) |
G | MM/dd/yyyy HH:mm | General (short date and short time)(通用模式,短日期和短时间) |
G | MM/dd/yyyy HH:mm:ss | General (short date and long time)(通用模式,短日期和长时间) |
M,M | MMMM dd | MonthDayPattern(月天模式) |
r,R | ddd,dd MMM yyyy,HH':'mm':'ss 'GMT' | RFC1123Pattern (RFC1123模式) |
S | yyyy-MM-dd HH:mm:ss | SortableDateTimePattern (conforms to ISO 8601) using local time(使用本地时间的可排序模式) |
T | HH:mm | ShortTimePattern (短时间模式) |
T | HH:mm:ss | LongTimePattern(长时间模式) |
U | yyyy-MM-dd HH:mm:ss | UniversalSortable-DateTimePattern (conforms to ISO 8601) using universal time(通用可排序模式) |
U | dddd,MMMM dd,yyyy,HH:mm:ss | UniversalSortable-DateTimePattern(通用可排序模式) |
y,Y | MMMM,yyyy | YearMonthPattern(年月模式) |