string.format复合格式化

复合格式化

通过 .NET Framework 复合格式化功能,您可以提供值列表和由交替出现的固定文本和索引占位符组成的源字符串,还能轻松地获得由夹杂着格式化值的原始固定文本组成的结果字符串。复合格式化可以用于一些方法,如 String.Format(返回格式化字符串)方法和 Console.WriteLine(将输出字符串显示到控制台)方法等,也可用于 TextWriter.WriteLine(将输出字符串写到流或文件)的实现。

每个索引占位符或格式项都对应值列表中的一个元素。复合格式化功能返回新的输出字符串,其中嵌入源字符串的每个格式项都被对应的格式化值替换。

源字符串包含被一个或多个格式项分隔开的零个或多个固定文本段。固定文本可以包含您选择的任何内容。

下面是一个 String.Format 示例。

[Visual Basic]
Dim myName As String = "Fred"
String.Format("Name = {0}, hours = {1:hh}", myName, DateTime.Now)
[C#]
string myName = "Fred";
String.Format("Name = {0}, hours = {1:hh}", myName, DateTime.Now);

固定文本是“Name =”和“, hours =”,格式项是“{0}”和“{1:hh}”,值为 myNameDateTime.Now

格式项语法

所有格式项都采用下面的形式。

{index[,alignment][:formatString]}

必须使用成对的大括号(“{”和“}”)。因为左右大括号分别被解释为格式项的开始和结束,所以要在固定文本中显示一个左括号(“{”),必须指定两个左括号(“{{”);要在固定文本中显示一个右括号(“}”),必须指定两个右括号(“}}”)。

格式项由下面的组件构成。

索引组件

强制“索引”组件(也叫参数说明符)是一个从 0 开始的数字,可标识值列表中对应的元素。也就是说,参数说明符为 0 的格式项格式化列表中的第一个值,参数说明符为 1 的格式项格式化列表中的第二个值,依次类推。

通过指定相同的参数说明符,多个格式项可以引用值列表中的同一个元素。例如,通过指定类似于“{0:X} {0:E} {0:N}”的源字符串,可以将同一个数值格式化为十六进制、科学表示法和数字格式。

每一个格式项都可以引用所有的参数。例如,如果有三个值,则可以通过指定类似于“{1} {0} {2}”的源字符串来格式化第二、第一和第三个值。格式项未引用的值会被忽略。如果参数说明符指定了超出值列表范围的项,将导致运行时异常。

对齐组件

可选的“对齐”组件是一个带符号的整数,指示首选的格式化字段宽度。如果“对齐”值小于格式化字符串的长度,“对齐”会被忽略,并且使用格式化字符串的长度作为字段宽度。如果“对齐”为正数,字段的格式化数据为右对齐;如果“对齐”为负数,字段的格式化数据为左对齐。如果需要填充,则使用空白。如果指定“对齐”,就需要使用逗号。

格式字符串组件

可选的“格式字符串”组件由标准或自定义格式说明符组成。如果不指定“格式字符串”,则使用常规(“G”)格式说明符。如果指定“格式说明符”,需要使用冒号。

处理顺序

如果要格式化的值是 null(在 Visual Basic 中为 Nothing),则返回空字符串 ("")。

如果要格式化的类型实现 ICustomFormatter 接口,则调用 ICustomFormatter.Format 方法。

如果前面的步骤未格式化类型,并且该类型实现 IFormattable 接口,则调用 IFormattable.ToString 方法。

如果前面的步骤未格式化类型,则调用该类型的 ToString 方法(从 Object 类继承而来)。

前面的步骤执行完毕之后应用对齐。

代码示例

下面的示例显示使用复合格式化创建的一个字符串和使用对象的 ToString 方法创建的另一个字符串。两种格式化类型产生相同的结果。

[Visual Basic]
Dim FormatString1 As String = String.Format("{0:dddd MMMM}", DateTime.Now)
Dim FormatString2 As String = DateTime.Now.ToString("dddd MMMM")
[C#]
string FormatString1 = String.Format("{0:dddd MMMM}", DateTime.Now);
string FormatString2 = DateTime.Now.ToString("dddd MMMM");

假定当前日期是五月的星期四,在美国英语区域性中上述示例中的两个字符串的值都是 Thursday May

Console.WriteLineString.Format 公开同样的功能。两种方法的唯一不同是:String.Format 以字符串的形式返回其结果,而 Console.WriteLine 将结果写入到与 Console 对象关联的输出流。下面的示例使用 Console.WriteLine 方法将 MyInt 的值格式化为货币值。

[Visual Basic]
Dim MyInt As Integer = 100
Console.WriteLine("{0:C}", MyInt)
[C#]
int MyInt = 100;
Console.WriteLine("{0:C}", MyInt);

此代码在当前区域性为美国英语的计算机上,将 $100.00 显示到控制台。

下面的示例说明格式化多个对象,包括用两种不同的方式格式化一个对象。

[Visual Basic]
Dim myName As String = "Fred"
String.Format("Name = {0}, hours = {1:hh}, minutes = {1:mm}",
myName, DateTime.Now)
[C#]
string myName = "Fred";
String.Format("Name = {0}, hours = {1:hh}, minutes = {1:mm}",
myName, DateTime.Now);

以上字符串的输出是“Name = Fred, hours = 07, minutes = 23”,其中当前的时间反映了这些数字。

下列示例说明了对齐在格式化中的使用。格式化的参数放置在垂直条字符 (| ) 之间,以突出显示最终的对齐方式。

[Visual Basic]
Dim myFName As String = "Fred"
Dim myLName As String = "Opals"
Dim myInt As Integer = 100
Dim FormatFName As String = String.Format("First Name = |{0,10}|", myFName)
Dim FormatLName As String = String.Format("Last Name = |{0,10}|", myLName)
Dim FormatPrice As String = String.Format("Price = |{0,10:C }|", myInt)
Console.WriteLine(FormatFName)
Console.WriteLine(FormatLName)
Console.WriteLine(FormatPrice)
FormatFName = String.Format("First Name = |{0,-10}|", myFName)
FormatLName = String.Format("Last Name = |{0,-10}|", myLName)
FormatPrice = String.Format("Price = |{0,-10:C }|", myInt)
Console.WriteLine(FormatFName)
Console.WriteLine(FormatLName)
Console.WriteLine(FormatPrice)
[C#]
string myFName = "Fred";
string myLName = "Opals";
int myInt = 100;
string FormatFName = String.Format("First Name = {0,10}", myFName);
string FormatLName = String.Format("Last Name = {0,10}", myLName);
string FormatPrice = String.Format("Price = {0,10:C}", myInt);
Console.WriteLine(FormatFName);
Console.WriteLine(FormatLName);
Console.WriteLine(FormatPrice);
FormatFName = String.Format("First Name = |{0,-10}|", myFName);
FormatLName = String.Format("Last Name = |{0,-10}|", myLName);
FormatPrice = String.Format("Price = |{0,-10:C}|", myInt);
Console.WriteLine(FormatFName);
Console.WriteLine(FormatLName);
Console.WriteLine(FormatPrice);

在美国英语区域性中,上述代码将下列内容显示到控制台。不同的区域性显示不同的货币符号和分隔符。

First Name = |          Fred|
Last Name = |         Opals|
Price = |           $100.00|
First Name = |Fred      |
Last Name = |Opals     |
Price = |$100.00   |

标准数字格式字符串

标准数字格式字符串用于格式化通用数值类型。标准格式字符串采取“Axx”形式,其中“A”为单个字母字符(被称为格式说明符),“xx”是可选的整数(被称为精度说明符)。格式说明符必须是某个内置格式符。精度说明符的范围从 0 到 99,它控制有效位数或小数点右边零的个数。格式字符串不能包含空白。

如果格式字符串不包含某个标准格式说明符,则引发 FormatException。例如,格式字符串“z”会由于包含一个字母字符而被解释为标准数字格式字符串,但字母字符不属于标准数字格式说明符,所以会引发 FormatException。任何不符合标准数字格式字符串定义的数字格式字符串都被解释为自定义数字格式字符串。格式字符串“c!”包含两个字母字符,因此被解释为自定义格式字符串,尽管字符“c”是标准数字格式说明符。

下表描述了标准数字格式字符串。请注意,这些格式说明符产生的输出字符串受“区域选项”控制面板中的设置的影响。使用不同设置的计算机会生成不同的输出字符串。

格式说明符名称说明
C 或 c货币数字转换为表示货币金额的字符串。转换由用于格式化数字的 NumberFormatInfo 对象的货币格式信息控制。精度说明符指示所需的小数位数。如果省略精度说明符,则使用 NumberFormatInfo 给定的默认货币精度。
D 或 d十进制只有整型才支持此格式。数字转换为十进制数字 (0-9) 的字符串,如果数字为负,则前面加负号。精度说明符指示结果字符串中所需的最少数字个数。如果需要的话,则用零填充该数字的左侧,以产生精度说明符给定的数字个数。
E 或 e科学计数法(指数)数字转换为“-d.ddd...E+ddd”或“-d.ddd...e+ddd”形式的字符串,其中每个“d”表示一个数字 (0-9)。如果该数字为负,则该字符串以减号开头。小数点前总有一个数字。精度说明符指示小数点后所需的位数。如果省略精度说明符,则使用默认值,即小数点后六位数字。格式说明符的大小写指示在指数前加前缀“E”还是“e”。指数总是由正号或负号以及最少三位数字组成。如果需要,用零填充指数以满足最少三位数字的要求。
F 或 f固定点数字转换为“-ddd.ddd...”形式的字符串,其中每个“d”表示一个数字 (0-9)。如果该数字为负,则该字符串以减号开头。精度说明符指示所需的小数位数。如果忽略精度说明符,则使用 NumberFormatInfo 给定的默认数值精度。
G 或 g常规根据数字类型以及是否存在精度说明符,数字会转换为固定点或科学记数法的最紧凑形式。如果精度说明符被省略或为零,则数字的类型决定默认精度,如下表所示。
  • ByteSByte:3
  • Int16UInt16:5
  • Int32UInt32:10
  • Int64UInt64:19
  • Single:7
  • Double:15
  • Decimal:29

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

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

N 或 n数字数字转换为“-d,ddd,ddd.ddd...”格式的字符串,其中每个“d”表示一个数字 (0-9)。如果该数字为负,则该字符串以减号开头。小数点左边每三个数字之间插入一个千位分隔符。精度说明符指示所需的小数位数。如果忽略精度说明符,则使用 NumberFormatInfo 给定的默认数值精度。
P 或 p百分比数字转换为由 NumberFormatInfo.PercentNegativePattern 属性或 NumberFormatInfo.PercentPositivePattern 属性定义的、表示百分比的字符串。如果数字为负,则产生的字符串由 PercentNegativePattern 定义并以负号开头。已转换的数字乘以 100 以表示为百分比。精度说明符指示所需的小数位数。如果省略精度说明符,则使用 NumberFormatInfo 给定的默认数值精度。
R 或 r往返过程往返过程说明符保证转换为字符串的数值再次被分析为相同的数值。使用此说明符格式化数值时,首先用常规格式测试:Double 使用 15 位精度,Single 使用 7 位精度。如果此值被成功地分析回相同的数值,则使用常规格式说明符对其进行格式化。但是,如果此值未被成功地分析为相同的数值,则它这样格式化:Double 使用 17 位精度,Single 使用 9 位精度。虽然精度说明符可以追加到往返过程格式说明符,但它将被忽略。使用此说明符时,往返过程优先于精度。此格式仅受浮点型支持。
X 或 x十六进制数字转换为十六进制数字的字符串。格式说明符的大小写指示对大于 9 的十六进制数字使用大写字符还是小写字符。例如,使用“X”产生“ABCDEF”,使用“x”产生“abcdef”。精度说明符指示结果字符串中所需的最少数字个数。如果需要的话,则用零填充该数字的左侧,以产生精度说明符给定的数字个数。只有整型才支持此格式。
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章