C# 格式化字符串的实现代码

2019-12-30 14:43:22刘景俊

 

如果我们使用下面的表达方式,让我们看看会发生什么


public class FormatSpecApp
{
 public static void Main(string[] args)
 {
  int i = 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

R(圆整)格式仅仅对浮点数有效。这个值首先会用通用格式来格式化。对于双精度数有15位精度,对于单精度数有7位精度。如果这个值可以被正确地解析回原始的数字,就会用通用格式符来格式化。如果不能解析回去的话,那么就会用17位精度来格式化双精度数,用9位精度来格式化单精度数。尽管我们可以在圆整标识符后面添加有效数字的位数,但是它会被忽略掉。


double d = 1.2345678901234567890;
Console.WriteLine("Floating-Point:t{0:F16}", d); // 1.2345678901234600
Console.WriteLine("Roundtrip:t{0:R16}", d);  // 1.2345678901234567

如果标准格式化标识符还不能满足你。你可以使用图形化格式字符串来创建定制的字符串输出。图形化格式化使用占位符来表示最小位数,

最大位数,定位符号,负号的外观以及其它数字符号的外观。就像下表所示

 

符号 名称 含义
0 0占位符 用0填充不足的位数
# 数字占位符 用#代替实际的位数
. 十进制小数点  
, 千位分隔符 用逗号进行千位分割,比如把1000分割成1,000
% 百分符号 显示一个百分标识
E+0
E-0
e+0
e-0
指数符号 用指数符号格式化输出
专一字符 用于传统格式的格式化序列,比如"n"(新行)
'ABC'
"ABC"
常量字符串  显示单引号或者双引号里面的字符串
; 区域分隔符  如果数字会被格式化成整数,负数,或者0,用;来进行分隔
,. 缩放符号 数字除以1000