標準數值格式字串
更新:2007 年 11 月
標準數值格式字串會用來格式化一般數字型別。標準數值格式字串會採用 Axx 格式,其中 A 是一個字母字元,稱為格式規範,而 xx 則是一個選擇性的整數,稱為精確度規範。精確度規範的範圍從 0 到 99,而且會影響結果內的位數。任何包含一個以上字母字元 (包含泛空白字元 (White Space)) 的數值格式字串都會解譯為自訂數值格式字串。
下表描述標準數值格式規範,並顯示每個格式範例所產生的範例輸出。如需詳細資訊,請參閱表格之後的注意事項。
格式規範 |
名稱 |
說明 |
---|---|---|
C 或 c |
貨幣 |
數值將轉換為表示貨幣數量的字串。轉換是由目前 NumberFormatInfo 物件的貨幣格式資訊所控制。 精確度規範指示所需要的小數位數。如果省略精確度規範,則會使用目前 NumberFormatInfo 物件所提供的預設貨幣精確度。 下列範例會使用貨幣格式規範格式化 Double 值。
|
D 或 d |
十進位 |
只有整數類資料型別 (Integral Type) 才支援這個格式。數值將會被轉換為十進位數 (0-9) 的字串,如果數值為負數,則在前面加上負號。 精確度規範指示產生的字串中所需要的最少位數。如果有必要,數值以零填補其左邊,產生精確度規範所指定的位數。 下列範例會使用十進位格式規範格式化 Int32 值。
|
E 或 e |
科學 (指數的) |
數字會轉換為 "-d.ddd…E+ddd" 或 "-d.ddd…e+ddd" 型式的字串,其中 "d" 表示數字 (0-9)。字串以負號開始,如果數值為負數的話。在小數點前面永遠會有一個位數。 精確度規範指示小數點之後需要的位數。如果省略精確度規範,則使用小數點之後有六位數的預設值。 格式規範的大小寫指示是否在指數之前加上 'E' 或 'e'。指數永遠由正號或負號和最少三位數所組成。必要時,指數將以零填補來符合指定的最少位數。 下列範例會使用科學記號格式規範格式化 Double 值。
|
F 或 f |
固定點 |
數字會轉換為 "-ddd.ddd..." 型式的字串,其中 "d" 表示數字 (0-9)。字串以負號開始,如果數值為負數的話。 精確度規範指示所需要的小數位數。如果省略精確度規範,則會使用目前 NumberFormatInfo 物件的 NumberDecimalDigits 屬性所提供的預設數值精確度。 下列範例會使用定點格式規範格式化 Double 和 Int32 值。
|
G 或 g |
一般 |
數字會轉換為固定點或科學標記法中最精簡的一個,端視數字的型別和精確度規範是否存在而定。如果精確度規範已省略或為零,數字的型別將決定預設的精確度,如下列清單所顯示的。 如果以科學標記法來表示數字所產生的指數大於 -5 而且小於精確度規範,則會使用固定點標記法,否則使用科學標記法。必要時,結果會包含小數點並省略字串後端的零。如果精確度規範存在而且結果中的有效位數超過指定的精確度,那麼超出的後端位數會藉由四捨五入來移除。 前面規則的例外是如果數字為 Decimal 而精確度規範已省略的情形。在該情形下,永遠使用固定點標記法並且保留後端的零。 要是使用科學標記法,如果格式規範為 'G',結果中的指數前面會加上 'E';如果格式規範為 'g',則加上 'e'。 下列範例會使用一般格式規範來格式化各種浮點數值。
|
N 或 n |
數字 |
數字會轉換為 "-d,ddd,ddd.ddd…" 格式的字串,其中 '-' 表示負數符號 (若有必要)、'd' 表示數字 (0-9)、',' 表示數字群組之間的千位分隔符號,而 '.' 則表示小數點符號。實際的負數模式、數字群組大小、千位分隔符號和小數分隔符號是分別由目前 NumberFormatInfo 物件的 NumberNegativePattern、NumberGroupSizes、NumberGroupSeparator 和 NumberDecimalSeparator 屬性所指定。 精確度規範指示所需要的小數位數。如果省略精確度規範,則會使用目前 NumberFormatInfo 物件的 NumberDecimalDigits 屬性所提供的預設數值精確度。 下列範例會使用數字格式規範來格式化各種浮點數值。
|
P 或 p |
百分比 |
如果數字為負數,數字會轉換為表示 NumberFormatInfo.PercentNegativePattern 屬性所定義的百分比字串;如果數字為正數,則轉換為表示 NumberFormatInfo.PercentPositivePattern 屬性所定義的百分比字串。轉換的數值要乘以 100,以便呈現為百分比。 精確度規範指示所需要的小數位數。如果省略精確度規範,則會使用目前 NumberFormatInfo 物件所提供的預設數值精確度。 下列範例會使用百分比格式規範來格式化浮點數值。
|
R 或 r |
來回 |
只有 Single 和 Double 型別才支援這個格式。來回規範保證轉換為字串的數值將會被剖析還原成相同數值。當數值使用這個規範來格式化時,它首先使用一般格式 (具有 15 位精確度的 Double 和 7 位精確度的 Single) 來測試。如果該值成功地剖析回到相同數值,即會使用一般格式規範來格式化。然而,如果這個值無法成功地剖析回到相同數值,就會使用 17 位數精確度的 Double 和 9 位數精確度的 Single 來格式化這個值。 雖然精確度規範可以存在,仍舊會被忽略。使用來回規範時,這個規範優先於精確度規範。 下列範例會使用往返格式規範格式化 Double 值。
|
X 或 x |
十六進位 |
只有整數類資料型別 (Integral Type) 才支援這個格式。數值將轉換為十六進位數字的字串。格式規範的大小寫指示是否要使用大寫或小寫字元於大於 9 的十六進位數字。例如,使用 'X' 產生 "ABCDEF",而 'x' 產生 "abcdef"。 精確度規範指示產生的字串中所需要的最少位數。如果有必要,數值以零填補其左邊,產生精確度規範所指定的位數。 下列範例會使用十六進位格式規範格式化 Int32 值。
|
任何其他單一字元 |
(未知的規範) |
(未知的規範會在執行階段擲回 FormatException) |
注意
控制台設定值
[控制台] 中 [地區及語言選項] 項目的設定會影響格式化作業所產生的結果字串。這些設定是用來初始化與目前執行緒文化特性相關聯的 NumberFormatInfo 物件,而且目前的執行緒文化特性會提供用來管理格式的值。使用不同設定的電腦將會產生不同的結果字串。
此外,如果 CultureInfo.CultureInfo(String) 建構函式用來將新的 CultureInfo 物件具現化,而此物件代表的文化特性與目前系統文化特性相同,則 [控制台] 中的 [區域及語言選項] 項目所建立之任何自訂都會套用至 CultureInfo 物件。您可以使用 CultureInfo.CreateSpecificCulture 方法建立未反映系統自訂的 CultureInfo。
NumberFormatInfo 屬性
格式會受到目前 NumberFormatInfo 物件的影響,而此物件是由目前執行緒文化特性隱含提供或由叫用格式之方法的 IFormatProvider 參數明確提供。為該參數指定 NumberFormatInfo 或 CultureInfo 物件。
整數類資料型別和浮點數值型別
標準數值格式規範的某些描述會參考整數類資料型別或浮點數值型別。整數類資料數字型別 (Numeric Type) 有 Byte、SByte、Int16、Int32、Int64、UInt16、UInt32 和 UInt64。浮點數值型別有 Decimal、Single 和 Double。
無限浮點數和 NaN
請注意,不管格式字串為何,如果 Single 或 Double 浮點型別為正無限大、負無限大或不是數字 (NaN),則格式化後的字串分別會是由目前適用之 NumberFormatInfo 物件所指定的 PositiveInfinitySymbol、NegativeInfinitySymbol 或 NaNSymbol 屬性。
範例
下列範例會使用 en-us 文化特性和所有標準數值格式規範來格式化整數和浮點數值。這個範例使用兩個特定的數字型別 (Numeric Type),但是對任何數字基底型別 (Byte、SByte、Int16、Int32、Int64、UInt16、UInt32、UInt64、Decimal、Single 和 Double) 都會產生類似的結果。
Option Strict On
Imports System.Globalization
Imports System.Threading
Module NumericFormats
Public Sub Main()
' Display string representations of numbers for en-us culture
Dim ci As New CultureInfo("en-us")
' Output floating point values
Dim floating As Double = 10761.937554
Console.WriteLine("C: {0}", _
floating.ToString("C", ci)) ' Displays "C: $10,761.94"
Console.WriteLine("E: {0}", _
floating.ToString("E03", ci)) ' Displays "E: 1.076E+004"
Console.WriteLine("F: {0}", _
floating.ToString("F04", ci)) ' Displays "F: 10761.9376"
Console.WriteLine("G: {0}", _
floating.ToString("G", ci)) ' Displays "G: 10761.937554"
Console.WriteLine("N: {0}", _
floating.ToString("N03", ci)) ' Displays "N: 10,761.938"
Console.WriteLine("P: {0}", _
(floating/10000).ToString("P02", ci)) ' Displays "P: 107.62 %"
Console.WriteLine("R: {0}", _
floating.ToString("R", ci)) ' Displays "R: 10761.937554"
Console.WriteLine()
' Output integral values
Dim integral As Integer = 8395
Console.WriteLine("C: {0}", _
integral.ToString("C", ci)) ' Displays "C: $8,395.00"
Console.WriteLine("D: {0}", _
integral.ToString("D6")) ' Displays D: 008395""
Console.WriteLine("E: {0}", _
integral.ToString("E03", ci)) ' Displays "E: 8.395E+003"
Console.WriteLine("F: {0}", _
integral.ToString("F01", ci)) ' Displays "F: 8395.0"
Console.WriteLine("G: {0}", _
integral.ToString("G", ci)) ' Displays "G: 8395"
Console.WriteLine("N: {0}", _
integral.ToString("N01", ci)) ' Displays "N: 8,395.0"
Console.WriteLine("P: {0}", _
(integral/10000).ToString("P02", ci)) ' Displays "P: 83.95 %"
Console.WriteLine("X: 0x{0}", _
integral.ToString("X", ci)) ' Displays "X: 0x20CB"
Console.WriteLine()
End Sub
End Module
using System;
using System.Globalization;
using System.Threading;
public class NumericFormats
{
public static void Main()
{
// Display string representations of numbers for en-us culture
CultureInfo ci = new CultureInfo("en-us");
// Output floating point values
double floating = 10761.937554;
Console.WriteLine("C: {0}",
floating.ToString("C", ci)); // Displays "C: $10,761.94"
Console.WriteLine("E: {0}",
floating.ToString("E03", ci)); // Displays "E: 1.076E+004"
Console.WriteLine("F: {0}",
floating.ToString("F04", ci)); // Displays "F: 10761.9376"
Console.WriteLine("G: {0}",
floating.ToString("G", ci)); // Displays "G: 10761.937554"
Console.WriteLine("N: {0}",
floating.ToString("N03", ci)); // Displays "N: 10,761.938"
Console.WriteLine("P: {0}",
(floating/10000).ToString("P02", ci)); // Displays "P: 107.62 %"
Console.WriteLine("R: {0}",
floating.ToString("R", ci)); // Displays "R: 10761.937554"
Console.WriteLine();
// Output integral values
int integral = 8395;
Console.WriteLine("C: {0}",
integral.ToString("C", ci)); // Displays "C: $8,395.00"
Console.WriteLine("D: {0}",
integral.ToString("D6", ci)); // Displays D: 008395""
Console.WriteLine("E: {0}",
integral.ToString("E03", ci)); // Displays "E: 8.395E+003"
Console.WriteLine("F: {0}",
integral.ToString("F01", ci)); // Displays "F: 8395.0"
Console.WriteLine("G: {0}",
integral.ToString("G", ci)); // Displays "G: 8395"
Console.WriteLine("N: {0}",
integral.ToString("N01", ci)); // Displays "N: 8,395.0"
Console.WriteLine("P: {0}",
(integral/10000).ToString("P02", ci)); // Displays "P: 83.95 %"
Console.WriteLine("X: 0x{0}",
integral.ToString("X", ci)); // Displays "X: 0x20CB"
Console.WriteLine();
}
}