C# String.Format的格式限定符与Format方法将多个对象格式化一个字符串原理

Format方法将多个对象格式化成一个字符串Format方法解析格式字符串的原理:

(1)、格式字符串中的{0}会被替换成格式字符串之后的第一个参数,以此类推

(2)、Format方法解析格式字符串时,发现可替换参数0,则调用对应参数的IFormattable接口的ToString方法,如果格式化字符串中的可替换参数0后面跟着格式限定符.则将格式限定符传递给ToString方法.没有则传递默认的方法.

(3)、、Format方法解析格式字符串时,发现可替换参数0,如果对应参数没有继承IFormattable接口,则调用该类型的ToString()方法,没有则调用Object的ToString方法.

var str = string.Format("没有继承IFormattable接口的自定义类型:{0},继承了IFormattable接口的自定义类型:{1}", new Program(),1);
            Console.WriteLine(str);

 

1、C一格式化货币  

C6代表将数字转换成当前线程国家的货币符号形式的大小并保留6位小数

var number = 100;
var outPut = $"{number:C6}";
Console.WriteLine(outPut);

 

2、D一将整形转换成10进制

,D99表示将数字转换成十进制,并以零填充保留99位

var number = 100;
var outPut = $"{number:D99}";
Console.WriteLine(outPut);

 

3、N一用分号分隔数字,默认三位加一个分号

N3表示将数字转换成以分号分隔的数字,并保留3位小数

var number = 1000000000;
var outPut = $"{number:N3}";
Console.WriteLine(outPut);

 

4、P一将数字转成百分比,默认在百分比后面保留两位小数

P0表示将数字转换成百分比,并保留零位小数

var number = 1;
var outPut = $"{number:P0}";
Console.WriteLine(outPut);

 

5、0一零占位符

00000表示先用0占5个位子,如果要格式化的值在0的位置有一个数字,则此数字被复制到该0的位置处,如果格式化值得长度大于00000的长度,不会舍弃,原样保存.如果小于则用0填充.

.00表示格式化的值的小数部分保留2位,如果第三位大于等于5,则4舍五入.如果小于两位第二位用0填充,以此类推.

int number = 100;
var str = $"{number:00000}";
Console.WriteLine(str);

 int number = 1000000;
var str = $"{number:00000.00}";
Console.WriteLine(str);

 

6、#一数字占位符

####表示给数字预留4个位子,将格式化的值复制到数字占位符中.

注:这个过程格式化值整数部分的0总会被舍弃.

var number = 098804;
var str = $"{number:####}";
Console.WriteLine(str);

.#表示给小数部分留一个数字位,如果有两位小数,第二位执行四舍五入操作.

var number = 098804.15;
var str = $"{number:####.#}";
Console.WriteLine(str);

注:如果两位小数,第一位为0,第二位小于4,那么末尾的0会被舍弃

var number = 19884.049;
var str = $"{number:####.#}";
Console.WriteLine(str);

 

注:#占位符开头和末尾的0值总是会被舍弃,而0占位符则不会.

 

7、空格占位符

将目标字符串格式化成10个字符,原字符左对齐,不足补空格.

var number = "666";
var str = string.Format("{0,10}", number);
Console.WriteLine("$"+str+"$");

同样的效果用String的实例PadLeft方法也可以实现

var number = "666";
var str = number.PadLeft(10);
Console.WriteLine("$"+str+"$");

当然PadLeft支持填充自定义字符,空格占位符只能用空格.

讲完向左的空格占位符,现在说向右的占位符

var number = "666";
var str = string.Format("{0,-10}", number);
Console.WriteLine("$"+str+"$");

PadRight就不说了

 

8、E或e一科学计数法

var number = 666;
var str = $"{number:e} {number:E}";
Console.WriteLine(str);

 

9、F或f一把目标值转换成小数

后面跟着的数字代表保留多少为的小数,默认保留两位,这是NumberFormatInfo默认给定的精度.

var number = -6666.66;
var str = $"{number:f6} {number:F3}";
Console.WriteLine(str);

 

10、G或g一常规

根据数字类型以及是否存在精度说明符,数字会转换为定点或科学记数法的最紧凑形式。如果精度说明符被省略或为零,则数字的类型决定默认精度,如下表所示。

Byte 或 SByte:3

Int16 或 UInt16:5

Int32 或 UInt32:10

Int64 或 UInt64:19

Single:7

Double:15

Decimal:29

如果用科学记数法表示数字时指数大于 -5 而且小于精度说明符,则使用定点表示法;否则使用科学记数法。如果要求有小数点,并且忽略尾部零,则结果包含小数点。如果精度说明符存在,并且结果的有效数字位数超过指定精度,则通过舍入删除多余的尾部数字。

上述规则有一个例外:如果数字是 Decimal 而且省略精度说明符时。在这种情况下总使用定点表示法并保留尾部零。

使用科学记数法时,如果格式说明符是“G”,结果的指数带前缀“E”;如果格式说明符是“g”,结果的指数带前缀“e”。 

 

11、N或n一数字转换标识,默认保留2位小数

将目标整型转换成数字类型,每3位用逗号分隔.

var number =-666;
var str = $"{number:N} {number:N6}";
Console.WriteLine(str);

 

12、R 或 r一往返过程

只有 Single 和 Double 类型支持此格式。往返过程说明符保证转换为字符串的数值再次被分析为相同的数值。使用此说明符格式化数值时,首先使用常规格式对其进行测试:Double 使用 15 位精度,Single 使用 7 位精度。如果此值被成功地分析回相同的数值,则使用常规格式说明符对其进行格式化。但是,如果此值未被成功地分析为相同数值,则它这样格式化:Double 使用 17 位精度,Single 使用 9 位精度。

虽然此处可以存在精度说明符,但它将被忽略。使用此说明符时,往返过程优先于精度。 

 

 13、X 或 x一十六进制转换

精度说明符指示结果字符串中所需的最少数字个数。如果需要的话,则用零填充该数字的左侧,以产生精度说明符给定的数字个数。 

 

 14、日期格式符

var dateFlag = new String[] { "G", "d", "D", "g", "M", "m", "s", "T", "t", "u", "U" , "Y" , "r" , "R" , "o" , "O" , "F" , "f" };
var now = DateTime.Now;
for (var i = 0; i < dateFlag.Length; i++)
{
      var flag = dateFlag[i];
      Console.WriteLine(flag+"   对应的日期生成规则的输出是:{0}", now.ToString(flag));
}
Console.ReadKey();

var now =DateTime.Now;
var str = $"{now:yyyy-MM-dd}";
Console.WriteLine(str);

M 或 m
月日模式
表示由当前 MonthDayPattern 属性定义的自定义 DateTime 格式字符串。

例如,用于固定区域性的自定义格式字符串为“MMMM dd”。

o
往返日期/时间模式
表示使用保留时区信息的模式的自定义 DateTime 格式字符串。该模式专用于往返 DateTime 格式(包括文本形式的 Kind 属性)。随后将 Parse 或 ParseExact 与正确的 Kind 属性值一起使用可以对格式化的字符串进行反向分析。

自定义格式字符串为“yyyy'-'MM'-'dd'T'HH':'mm':'ss.fffffffK”。

用于此说明符的模式是定义的标准。因此,无论所使用的区域性或所提供的格式提供程序是什么,它总是相同的。

R 或 r
RFC1123 模式
表示由当前 RFC1123Pattern 属性定义的自定义 DateTime 格式字符串。该模式是定义的标准,并且属性是只读的。因此,无论所使用的区域性或所提供的格式提供程序是什么,它总是相同的。

定义格式字符串为“ddd, dd MMM yyyy HH':'mm':'ss 'GMT'”。

格式化不会修改正在格式化的 DateTime 对象的值。因此,应用程序在使用此格式说明符之前必须将该值转换为协调世界时 (UTC)。

s
可排序的日期/时间模式;符合 ISO 8601
表示由当前 SortableDateTimePattern 属性定义的自定义 DateTime 格式字符串。此模式是定义的标准,并且属性是只读的。因此,无论所使用的区域性或所提供的格式提供程序是什么,它总是相同的。

自定义格式字符串为“yyyy'-'MM'-'dd'T'HH':'mm':'ss”。

t
短时间模式
表示由当前 ShortTimePattern 属性定义的自定义 DateTime 格式字符串。

例如,用于固定区域性的自定义格式字符串为“HH:mm”。

T
长时间模式
表示由当前 LongTimePattern 属性定义的自定义 DateTime 格式字符串。

例如,用于固定区域性的自定义格式字符串为“HH:mm:ss”。

u
通用的可排序日期/时间模式
表示由当前 UniversalSortableDateTimePattern 属性定义的自定义 DateTime 格式字符串。此模式是定义的标准,并且属性是只读的。因此,无论所使用的区域性或所提供的格式提供程序是什么,它总是相同的。

自定义格式字符串为“yyyy'-'MM'-'dd HH':'mm':'ss'Z'”。

格式化日期和时间时不进行时区转换。因此,应用程序在使用此格式说明符之前必须将本地日期和时间转换为协调世界时 (UTC)。

U
通用的可排序日期/时间模式
表示由当前 FullDateTimePattern 属性定义的自定义 DateTime 格式字符串。

此模式与完整日期/长时间 (F) 模式相同。但是,格式化将作用于等效于正在格式化的 DateTime 对象的协调世界时 (UTC)。

Y 或 y
年月模式
表示由当前 YearMonthPattern 属性定义的自定义 DateTime 格式字符串。

例如,用于固定区域性的自定义格式字符串为“yyyy MMMM”。

任何其他单个字符
(未知说明符)
未知说明符将引发运行时格式异常。


自定义 DateTime 格式字符串

格式说明符 说明 
d
将月中日期表示为从 1 至 31 的数字。一位数字的日期设置为不带前导零的格式。有关使用单个格式说明符的更多信息,请参见使用单个自定义格式说明符。

dd
将月中日期表示为从 01 至 31 的数字。一位数字的日期设置为带前导零的格式。

ddd
将一周中某天的缩写名称表示为当前 System.Globalization.DateTimeFormatInfo.AbbreviatedDayNames 属性中定义的名称。

dddd(另加任意数量的“d”说明符) 
将一周中某天的全名表示为当前 System.Globalization.DateTimeFormatInfo.DayNames 属性中定义的名称。

f
表示秒部分的最高有效位。

请注意,如果“f”格式说明符单独使用,没有其他格式说明符,则该说明符被看作是“f”标准 DateTime 格式说明符(完整日期/时间模式)。有关使用单个格式说明符的更多信息,请参见使用单个自定义格式说明符。

将此格式说明符与 ParseExact 或 TryParseExact 方法一起使用时,所用“f”格式说明符的数目指示要分析的秒部分的最高有效位位数。 

ff
表示秒部分的两个最高有效位。

fff
表示秒部分的三个最高有效位。

ffff
表示秒部分的四个最高有效位。

fffff
表示秒部分的五个最高有效位。

ffffff
表示秒部分的六个最高有效位。

fffffff
表示秒部分的七个最高有效位。

F
表示秒部分的最高有效位。如果该位为零,则不显示任何信息。有关使用单个格式说明符的更多信息,请参见使用单个自定义格式说明符。

将此格式说明符与 ParseExact 或 TryParseExact 方法一起使用时,所用“F”格式说明符的数目指示要分析的秒部分的最高有效位最大位数。

FF
表示秒部分的两个最高有效位。但不显示尾随零(或两个零位)。

FFF
表示秒部分的三个最高有效位。但不显示尾随零(或三个零位)。

FFFF
表示秒部分的四个最高有效位。但不显示尾随零(或四个零位)。

FFFFF
表示秒部分的五个最高有效位。但不显示尾随零(或五个零位)。

FFFFFF
表示秒部分的六个最高有效位。但不显示尾随零(或六个零位)。

FFFFFFF
表示秒部分的七个最高有效位。但不显示尾随零(或七个零位)。

g 或 gg(另加任意数量的“g”说明符) 
表示时期或纪元(例如 A.D.)。如果要设置格式的日期不具有关联的时期或纪元字符串,则忽略该说明符。有关使用单个格式说明符的更多信息,请参见使用单个自定义格式说明符。

h
将小时表示为从 1 至 12 的数字,即通过 12 小时制表示小时,自午夜或中午开始对整小时计数。因此,午夜后经过的某特定小时数与中午过后的相同小时数无法加以区分。小时数不进行舍入,一位数字的小时数设置为不带前导零的格式。例如,给定时间为 5:43,则此格式说明符显示“5”。有关使用单个格式说明符的更多信息,请参见使用单个自定义格式说明符。

hh, hh(另加任意数量的“h”说明符) 
将小时表示为从 01 至 12 的数字,即通过 12 小时制表示小时,自午夜或中午开始对整小时计数。因此,午夜后经过的某特定小时数与中午过后的相同小时数无法加以区分。小时数不进行舍入,一位数字的小时数设置为带前导零的格式。例如,给定时间为 5:43,则此格式说明符显示“05”。

H
将小时表示为从 0 至 23 的数字,即通过从零开始的 24 小时制表示小时,自午夜开始对小时计数。一位数字的小时数设置为不带前导零的格式。 

HH, HH(另加任意数量的“H”说明符) 
将小时表示为从 00 至 23 的数字,即通过从零开始的 24 小时制表示小时,自午夜开始对小时计数。一位数字的小时数设置为带前导零的格式。 

K
表示 DateTime.Kind 属性的不同值,即“Local”、“Utc”或“Unspecified”。此说明符以文本形式循环设置 Kind 值并保留时区。如果 Kind 值为“Local”,则此说明符等效于“zzz”说明符,用于显示本地时间偏移量,例如“-07:00”。对于“Utc”类型值,该说明符显示字符“Z”以表示 UTC 日期。对于“Unspecified”类型值,该说明符等效于“”(无任何内容)。

m
将分钟表示为从 0 至 59 的数字。分钟表示自前一小时后经过的整分钟数。一位数字的分钟数设置为不带前导零的格式。有关使用单个格式说明符的更多信息,请参见使用单个自定义格式说明符。

mm, mm(另加任意数量的“m”说明符) 
将分钟表示为从 00 至 59 的数字。分钟表示自前一小时后经过的整分钟数。一位数字的分钟数设置为带前导零的格式。

M
将月份表示为从 1 至 12 的数字。一位数字的月份设置为不带前导零的格式。有关使用单个格式说明符的更多信息,请参见使用单个自定义格式说明符。

MM
将月份表示为从 01 至 12 的数字。一位数字的月份设置为带前导零的格式。

MMM
将月份的缩写名称表示为当前 System.Globalization.DateTimeFormatInfo.AbbreviatedMonthNames 属性中定义的名称。

MMMM
将月份的全名表示为当前 System.Globalization.DateTimeFormatInfo.MonthNames 属性中定义的名称。

s
将秒表示为从 0 至 59 的数字。秒表示自前一分钟后经过的整秒数。一位数字的秒数设置为不带前导零的格式。有关使用单个格式说明符的更多信息,请参见使用单个自定义格式说明符。

ss, ss(另加任意数量的“s”说明符) 
将秒表示为从 00 至 59 的数字。秒表示自前一分钟后经过的整秒数。一位数字的秒数设置为带前导零的格式。

t
表示当前 System.Globalization.DateTimeFormatInfo.AMDesignator 或 System.Globalization.DateTimeFormatInfo.PMDesignator 属性中定义的 A.M./P.M. 指示符的第一个字符。如果正在格式化的时间中的小时数小于 12,则使用 A.M. 指示符;否则使用 P.M. 指示符。有关使用单个格式说明符的更多信息,请参见使用单个自定义格式说明符。

tt, tt(另加任意数量的“t”说明符) 
将 A.M./P.M. 指示符表示为当前 System.Globalization.DateTimeFormatInfo.AMDesignator 或 System.Globalization.DateTimeFormatInfo.PMDesignator 属性中定义的内容。如果正在格式化的时间中的小时数小于 12,则使用 A.M. 指示符;否则使用 P.M. 指示符。

y
将年份表示为最多两位数字。如果年份多于两位数,则结果中仅显示两位低位数。如果年份少于两位数,则该数字设置为不带前导零的格式。有关使用单个格式说明符的更多信息,请参见使用单个自定义格式说明符。

yy
将年份表示为两位数字。如果年份多于两位数,则结果中仅显示两位低位数。如果年份少于两位数,则用前导零填充该数字使之达到两位数。

yyy
将年份表示为三位数字。如果年份多于三位数,则结果中仅显示三位低位数。如果年份少于三位数,则用前导零填充该数字使之达到三位数。

请注意,对于年份可以为五位数的泰国佛历,此格式说明符将显示全部五位数。 

yyyy
将年份表示为四位数字。如果年份多于四位数,则结果中仅显示四位低位数。如果年份少于四位数,则用前导零填充该数字使之达到四位数。

请注意,对于年份可以为五位数的泰国佛历,此格式说明符将呈现全部五位数。 

yyyyy(另加任意数量的“y”说明符)
将年份表示为五位数字。如果年份多于五位数,则结果中仅显示五位低位数。如果年份少于五位数,则用前导零填充该数字使之达到五位数。

如果存在额外的“y”说明符,则用所需个数的前导零填充该数字使之达到“y”说明符的数目。 

z
表示系统时间距格林威治时间 (GMT) 以小时为单位测量的带符号时区偏移量。例如,位于太平洋标准时区中的计算机的偏移量为“-8”。

偏移量始终显示为带有前导符号。加号 (+) 指示小时数早于 GMT,减号 (-) 指示小时数迟于 GMT。偏移量范围为 –12 至 +13。一位数字的偏移量设置为不带前导零的格式。偏移量受夏时制影响。有关使用单个格式说明符的更多信息,请参见使用单个自定义格式说明符。

zz
表示系统时间距格林威治时间 (GMT) 以小时为单位测量的带符号时区偏移量。例如,位于太平洋标准时区中的计算机的偏移量为“-08”。

偏移量始终显示为带有前导符号。加号 (+) 指示小时数早于 GMT,减号 (-) 指示小时数迟于 GMT。偏移量范围为 –12 至 +13。一位数字的偏移量设置为带前导零的格式。偏移量受夏时制影响。

zzz, zzz(另加任意数量的“z”说明符) 
表示系统时间距格林威治时间 (GMT) 以小时和分钟为单位测量的带符号时区偏移量。例如,位于太平洋标准时区中的计算机的偏移量为“-08:00”。

偏移量始终显示为带有前导符号。加号 (+) 指示小时数早于 GMT,减号 (-) 指示小时数迟于 GMT。偏移量范围为 –12 至 +13。一位数字的偏移量设置为带前导零的格式。偏移量受夏时制影响。

 

posted @ 2018-06-12 09:14  郑小超  阅读(12431)  评论(0编辑  收藏  举报