複合格式化
通過 .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}
”,值爲 myName
和 DateTime.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.WriteLine 和 String.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 | 常規 | 根據數字類型以及是否存在精度說明符,數字會轉換爲固定點或科學記數法的最緊湊形式。如果精度說明符被省略或爲零,則數字的類型決定默認精度,如下表所示。
如果用科學記數法表示數字時指數大於 -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”。精度說明符指示結果字符串中所需的最少數字個數。如果需要的話,則用零填充該數字的左側,以產生精度說明符給定的數字個數。只有整型才支持此格式。 |