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

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

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

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

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

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

 

一、C一格式化货币  code

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

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

 

二、D一将整形转换成10进制对象

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

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

 

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

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

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

 

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

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

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

 

五、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);

 

六、#一数字占位符

####表示给数字预留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占位符则不会.

 

七、空格占位符

将目标字符串格式化成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就不说了

 

八、E或e一科学计数法

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

 

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

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

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

 

十、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”。 

 

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

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

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

 

十二、R 或 r一往返过程

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

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

 

 1三、X 或 x一十六进制转换

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

 

 1四、日期格式符

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。一位数字的偏移量设置为带前导零的格式。偏移量受夏时制影响。

相关文章
相关标签/搜索