標準數值格式字串可用來格式化一般數值類型。 標準數值格式字串的格式為 [format specifier][precision specifier],其中:
格式規範 是單一字母字元,可指定數位格式的類型,例如貨幣或百分比。 任何包含多個字母字元的數值格式字串,包括空格符,會解譯為自定義數值格式字串。 如需詳細資訊,請參閱 自定義數值格式字串。
有效位數規範 是會影響所產生字串中位數的選擇性整數。 在 .NET 7 和更新版本中,最大有效位數值為999,999,999。 在 .NET 6 中,最大有效位數值為 Int32.MaxValue。 在舊版 .NET 中,精確度的範圍可以從 0 到 99。 有效位數規範會控制數位字串表示中的位數。 它不會四捨五入數位本身。 若要執行四捨五入作業,請使用 Math.Ceiling、 Math.Floor或 Math.Round 方法。
當 有效位數規範 控制結果字串中的小數位數時,結果字串會反映捨入到最接近無限精確結果的可表示結果的數位。 如果有兩個同樣接近可表示的結果:
- 在最多 .NET Core 2.0 的 .NET Framework 和 .NET Core 上,運行時間會選取具有較大有效位數的結果(也就是使用 MidpointRounding.AwayFromZero)。
- 在 .NET Core 2.1 和更新版本上,運行時間會選取具有偶數最小有效位數的結果(也就是使用 MidpointRounding.ToEven)。
備註
有效位數規範會決定結果字串中的位數。 若要以前置或尾端空格填補結果字串,請使用 複合格式 設定功能,並在格式專案中定義 寬度元件 。
標準數值格式字串支援:
所有數值型別之 方法的
ToString一些多載。 例如,您可以將數值格式字串 Int32.ToString(String) 提供給 和 Int32.ToString(String, IFormatProvider) 方法。TryFormat所有數值型別的方法,例如 Int32.TryFormat(Span<Char>, Int32, ReadOnlySpan<Char>, IFormatProvider) 和 Single.TryFormat(Span<Char>, Int32, ReadOnlySpan<Char>, IFormatProvider)。.NET 複合格式設定功能,由 和
Write類別的WriteLine一些 Console 和 StreamWriter 方法、String.Format方法和 StringBuilder.AppendFormat 方法使用。 複合格式功能可讓您在單一字串中包含多個數據項的字串表示、指定欄位寬度,以及對齊欄位中的數位。 如需詳細資訊,請參閱 複合格式設定。C# 和 Visual Basic 中的插補字串,相較於複合格式字串,可提供簡化的語法。
小提示
您可以下載 格式化公用程式,這是 .NET Core Windows Forms 應用程式,可讓您將格式字串套用至數值或日期和時間值,並顯示結果字元串。 原始碼適用於 C# 和 Visual Basic。
標準格式規範
下表描述標準數值格式規範,並顯示每個格式規範所產生的範例輸出。 如需使用標準數值格式字串的詳細資訊,請參閱 Notes 一節,以及程式 代碼範例 一節,以取得其使用的完整說明。
特定文化特性之格式化字串的結果可能與下列範例不同。 您所使用的作系統設定、使用者設定、環境變數和 .NET 版本都可能會影響格式。 例如,從 .NET 5 開始,.NET 會嘗試跨平台統一文化格式。 如需詳細資訊,請參閱 .NET 全球化和ICU。
| 格式規範 | 名稱 | 說明 | 範例 |
|---|---|---|---|
| “B” 或 “b” | 二進制 | 結果:二進位字串。 支援:僅限整數類型 (.NET 8+)。 有效位數規範:結果字串中的位數。 詳細資訊: 二進位 (“B”) 格式規範。 |
42 (“B”) -> 101010 255 (“b16”) -> 0000000011111111 |
| “C” 或 “c” | 貨幣 | 結果:貨幣值。 支援:所有數值類型。 有效位數規範:十進位數。 預設有效位數規範:由 NumberFormatInfo.CurrencyDecimalDigits定義。 詳細資訊: 貨幣(“C”) 格式規範。 |
123.456 (“C”, en-US) -> 123.46 美元 123.456 (“C”, fr-FR) -> 123,46 歐元 123.456 (“C”, ja-JP) -> 123 日元 -123.456 (“C3”, en-US) -> (\$123.456) -123.456 (“C3”, fr-FR) -> -123,456 歐元 -123.456 (“C3”, ja-JP) -> -¥123.456 (日圓) |
| “D” 或 “d” | 十進制 | 結果:具有選擇性負號的整數數位。 支援:僅限整數型別。 有效位數規範:位數下限。 默認有效位數規範:所需的位數下限。 詳細資訊: Decimal(“D”) 格式規範。 |
1234 (“D”) -> 1234 年 -1234 (“D6”) -> -001234 |
| “E” 或 “e” | 指數(科學) | 結果:指數表示法。 支援:所有數值類型。 有效位數規範:十進位數。 默認有效位數規範:6。 詳細資訊: 指數 (“E”) 格式規範。 |
1052.0329112756 (“E”, en-US) -> 1.052033E+003 1052.0329112756 (“e”, fr-FR) -> 1,052033E+003 -1052.0329112756 (“e2”, en-US) -> -1.05E+003 -1052.0329112756 (“E2”, fr-FR) -> -1,05E+003 |
| “F” 或 “f” | 固定點 | 結果:具有選擇性負號的整數和十進位數。 支援:所有數值類型。 有效位數規範:十進位數。 預設有效位數規範:由 NumberFormatInfo.NumberDecimalDigits定義。 詳細資訊: Fixed-Point (“F”) 格式規範。 |
1234.567 (“F”, en-US) -> 1234.57 1234.567 (“F”, de-DE) -> 1234,57 元 1234 (“F1”, en-US) -> 1234.0 1234 (“F1”, de-DE) -> 1234,0 -1234.56 (“F4”, en-US) -> -1234.5600 -1234.56 (“F4”, de-DE) -> -1234,5600 元 |
| “G” 或 “g” | 一般 | 結果:固定點或科學表示法更精簡。 支援:所有數值類型。 有效位數規範:有效位數。 默認有效位數規範:取決於數值類型。 詳細資訊: 一般 (“G”) 格式規範。 |
-123.456 (“G”, en-US) -> -123.456 -123.456 (“G”, sv-SE) -> -123,456 123.4546 (“G4”, en-US) -> 123.5 123.4546 (“G4”, sv-SE) -> 123,5 -1.234567890e-25 (“G”, en-US) -> -1.23456789E-25 -1.234567890e-25 (“G”, sv-SE) -> -1,23456789E-25 |
| “N” 或 “n” | 數目 | 結果:整數和十進位數、群組分隔符,以及具有選擇性負號的小數分隔符。 支援:所有數值類型。 有效位數規範:小數字數的所需數目。 預設有效位數規範:由 NumberFormatInfo.NumberDecimalDigits定義。 詳細資訊: 數值 (“N”) 格式規範。 |
1234.567 (“N”, en-US) -> 1,234.57 1234.567 (“N”, ru-RU) -> 1 234,57 1234 (“N1”, en-US) -> 1,234.0 1234 (“N1”, ru-RU) -> 1 234,0 -1234.56 (“N3”, en-US) -> -1,234.560 -1234.56 (“N3”, ru-RU) -> -1 234,560 |
| “P” 或 “p” | 百分比 | 結果:數位乘以 100,並以百分比符號顯示。 支援:所有數值類型。 有效位數規範:小數字數的所需數目。 預設有效位數規範:由 NumberFormatInfo.PercentDecimalDigits定義。 詳細資訊: 百分比 (“P”) 格式規範。 |
1 (“P”, en-US) -> 100.00 % 1 (“P”, fr-FR) -> 100,000 % -0.39678 (“P1”, en-US) -> -39.7 % -0.39678 (“P1”, fr-FR) -> -39.7 % |
| “R” 或 “r” | 來回行程 | 結果:可以往返相同數位的字串。 支援: Single、 Double與 BigInteger。 注意:僅針對 BigInteger 類型建議使用。 針對類型,請使用 「G17」;針對DoubleSingle類型,請使用 「G9」。。 有效位數規範:忽略。 詳細資訊: 來回 (“R”) 格式規範。 |
123456789.12345678 (“R”) -> 123456789.12345678 -1234567890.12345678 (“R”) -> -1234567890.1234567 |
| “X” 或 “x” | 十六進位 | 結果:十六進位字串。 支援:僅限整數型別。 有效位數規範:結果字串中的位數。 詳細資訊: 十六進位 (“X”) 格式規範。 |
255 (“X”) -> FF -1 (“x”) -> FF 255 (“x4”) -> 00FF -1 (“X4”) -> 00FF |
| 任何其他單一字元 | 未知規範 | 結果:執行時丟出 a FormatException 。 |
使用標準數值格式字串
備註
本文中的 C# 範例會在 Try.NET 內嵌程式代碼執行器和遊樂場中執行。 選取 [執行] 按鈕以在互動式視窗中執行範例。 執行程式碼之後,您便可以修改它,並再選取一次 [執行] 來執行修改過的程式碼。 修改過的程式代碼會在互動式視窗中執行,或者,如果編譯失敗,互動式視窗會顯示所有 C# 編譯程式錯誤訊息。
標準數值格式字串可用來以下欄其中一種方式定義數值的格式設定:
它可以傳遞至
TryFormat方法或具有ToString參數之方法的多format載。 下列範例會將數值格式化為目前文化特性中的貨幣字串(在此案例中為 en-US 文化特性)。decimal value = 123.456m; Console.WriteLine(value.ToString("C2")); // Displays $123.46Dim value As Decimal = 123.456d Console.WriteLine(value.ToString("C2")) ' Displays $123.46它可以以與、
formatString和 String.Format這類方法Console.WriteLine搭配使用的格式專案中,提供為 StringBuilder.AppendFormat 自變數。 如需詳細資訊,請參閱 複合格式設定。 下列範例會使用格式專案在字串中插入貨幣值。decimal value = 123.456m; Console.WriteLine($"Your account balance is {value:C2}."); // Displays "Your account balance is $123.46."Dim value As Decimal = 123.456d Console.WriteLine("Your account balance is {0:C2}.", value) ' Displays "Your account balance is $123.46."您可以選擇性地提供
alignment自變數來指定數值欄位的寬度,以及其值是靠右或靠左對齊。 下列範例會將貨幣值靠左對齊 28 個字元欄位中,並將貨幣值靠右對齊 14 個字元欄位中。decimal[] amounts = { 16305.32m, 18794.16m }; Console.WriteLine(" Beginning Balance Ending Balance"); Console.WriteLine(" {0,-28:C2}{1,14:C2}", amounts[0], amounts[1]); // Displays: // Beginning Balance Ending Balance // $16,305.32 $18,794.16Dim amounts() As Decimal = {16305.32d, 18794.16d} Console.WriteLine(" Beginning Balance Ending Balance") Console.WriteLine(" {0,-28:C2}{1,14:C2}", amounts(0), amounts(1)) ' Displays: ' Beginning Balance Ending Balance ' $16,305.32 $18,794.16它可以在插入字串的插補表達式專案中提供為
formatString自變數。 如需詳細資訊,請參閱 C# 參考中的 字串插補 一文或 Visual Basic 參考中的 插補字串 一文。
下列各節提供每個標準數值格式字串的詳細資訊。
二進位格式規範 (B)
二進位 (“B”) 格式規範會將數字轉換成二進位數位字串。 只有整數型別才支援此格式,而且只支援 .NET 8+。
有效位數規範表示所產生字串中所需的最小位數。 如有需要,數位會以左邊的零填補,以產生有效位數規範所指定的位數。
針對 BigInteger,正值一律有前置零,以區別其與負值。 這可確保剖析時輸出往返原始值。 例如,使用格式規範3轉換的數位"B2"為 "011"。 這是因為二進位數"11"代表負值-1,因為它會解譯為由於2"B2"格式而完全位的數位。
結果字串不會受到目前 NumberFormatInfo 物件的格式化信息影響。
貨幣格式規範 (C)
“C” (或 currency) 格式規範會將數字轉換成代表貨幣金額的字串。 有效位數規範表示結果字串中所需的小數字數。 如果省略有效位數規範,則預設有效位數是由 NumberFormatInfo.CurrencyDecimalDigits 屬性所定義。
如果要格式化的值超過指定的或預設小數字數,則會在結果字串中四捨五入小數點值。 如果指定小數字數右邊的值是5或更大,則結果字串中的最後一個數位會捨入為零。
結果字串會受到目前 NumberFormatInfo 物件的格式化資訊所影響。 下表列出 NumberFormatInfo 控制所傳回字串格式的屬性。
| NumberFormatInfo 屬性 | 說明 |
|---|---|
| CurrencyPositivePattern | 定義正值貨幣符號的位置。 |
| CurrencyNegativePattern | 定義負值貨幣符號的位置,並指定負號是以括弧或 NegativeSign 屬性表示。 |
| NegativeSign | 定義如果使用的負號,表示 CurrencyNegativePattern 未使用括弧。 |
| CurrencySymbol | 定義貨幣符號。 |
| CurrencyDecimalDigits | 定義貨幣值中的預設十進位數。 您可以使用有效位數規範來覆寫此值。 |
| CurrencyDecimalSeparator | 定義分隔整數和十進位數的字串。 |
| CurrencyGroupSeparator | 定義分隔整陣群組的字串。 |
| CurrencyGroupSizes | 定義出現在群組中的整數位數。 |
下列範例會使用貨幣格式規範來格式化 Double 值:
double value = 12345.6789;
Console.WriteLine(value.ToString("C", CultureInfo.CurrentCulture));
Console.WriteLine(value.ToString("C3", CultureInfo.CurrentCulture));
Console.WriteLine(value.ToString("C3",
CultureInfo.CreateSpecificCulture("da-DK")));
// The example displays the following output on a system whose
// current culture is English (United States):
// $12,345.68
// $12,345.679
// 12.345,679 kr
Dim value As Double = 12345.6789
Console.WriteLine(value.ToString("C", CultureInfo.CurrentCulture))
Console.WriteLine(value.ToString("C3", CultureInfo.CurrentCulture))
Console.WriteLine(value.ToString("C3", _
CultureInfo.CreateSpecificCulture("da-DK")))
' The example displays the following output on a system whose
' current culture is English (United States):
' $12,345.68
' $12,345.679
' kr 12.345,679
十進位格式規範 (D)
“D” (或 decimal) 格式規範會將數字轉換成十進位數位符串(0-9),如果數位為負數,則前面會加上減號。 只有整數型別才支援此格式。
有效位數規範表示所產生字串中所需的最小位數。 如有需要,數位會以左邊的零填補,以產生有效位數規範所指定的位數。 如果未指定有效位數規範,則預設值是表示沒有前置零之整數所需的最小值。
結果字串會受到目前 NumberFormatInfo 物件的格式化資訊所影響。 如下表所示,單一屬性會影響結果字串的格式設定。
| NumberFormatInfo 屬性 | 說明 |
|---|---|
| NegativeSign | 定義字串,指出數位為負數。 |
下列範例會使用十進位格式規範來格式化 Int32 值。
int value;
value = 12345;
Console.WriteLine(value.ToString("D"));
// Displays 12345
Console.WriteLine(value.ToString("D8"));
// Displays 00012345
value = -12345;
Console.WriteLine(value.ToString("D"));
// Displays -12345
Console.WriteLine(value.ToString("D8"));
// Displays -00012345
Dim value As Integer
value = 12345
Console.WriteLine(value.ToString("D"))
' Displays 12345
Console.WriteLine(value.ToString("D8"))
' Displays 00012345
value = -12345
Console.WriteLine(value.ToString("D"))
' Displays -12345
Console.WriteLine(value.ToString("D8"))
' Displays -00012345
指數格式規範 (E)
指數 (“E”) 格式規範會將數字轉換成格式為 “-d.ddd...E+ddd“ 或 ”-d.ddd...e+ddd“,其中每個 ”d“ 都表示數位 (0-9)。 如果數位為負數,字串會以減號開頭。 只有一個數位一律在小數點之前。
有效位數規範表示小數點之後所需的位數。 如果省略有效位數規範,則使用小數點之後的預設值為六位數。
格式規範的案例會指出是否要在指數前面加上 「E」 或 「e」。 指數一律包含加號或減號,以及至少三位數。 如果必要,指數會以零填補,以符合此最小值。
結果字串會受到目前 NumberFormatInfo 物件的格式化資訊所影響。 下表列出 NumberFormatInfo 控制所傳回字串格式的屬性。
| NumberFormatInfo 屬性 | 說明 |
|---|---|
| NegativeSign | 定義字串,指出係數和指數的數位都是負數。 |
| NumberDecimalSeparator | 定義字串,這個字串會將整數數位與係數中的小數位數分隔開來。 |
| PositiveSign | 定義表示指數為正數的字串。 |
下列範例會使用指數格式規範來格式化 Double 值:
double value = 12345.6789;
Console.WriteLine(value.ToString("E", CultureInfo.InvariantCulture));
// Displays 1.234568E+004
Console.WriteLine(value.ToString("E10", CultureInfo.InvariantCulture));
// Displays 1.2345678900E+004
Console.WriteLine(value.ToString("e4", CultureInfo.InvariantCulture));
// Displays 1.2346e+004
Console.WriteLine(value.ToString("E",
CultureInfo.CreateSpecificCulture("fr-FR")));
// Displays 1,234568E+004
Dim value As Double = 12345.6789
Console.WriteLine(value.ToString("E", CultureInfo.InvariantCulture))
' Displays 1.234568E+004
Console.WriteLine(value.ToString("E10", CultureInfo.InvariantCulture))
' Displays 1.2345678900E+004
Console.WriteLine(value.ToString("e4", CultureInfo.InvariantCulture))
' Displays 1.2346e+004
Console.WriteLine(value.ToString("E", _
CultureInfo.CreateSpecificCulture("fr-FR")))
' Displays 1,234568E+004
固定點格式規範 (F)
固定點 (“F”) 格式規範會將數字轉換成格式為 “-ddd.ddd...” 格式的字串。其中每個 「d」 都表示數位 (0-9)。 如果數位為負數,字串會以減號開頭。
有效位數規範表示所需的小數位數。 如果省略有效位數規範,則目前的 NumberFormatInfo.NumberDecimalDigits 屬性會提供數值有效位數。
結果字串會受到目前 NumberFormatInfo 物件的格式化資訊所影響。 下表列出控制結果字串格式之 對象的屬性 NumberFormatInfo 。
| NumberFormatInfo 屬性 | 說明 |
|---|---|
| NegativeSign | 定義字串,指出數位為負數。 |
| NumberDecimalSeparator | 定義分隔整數數位與十進位數的字串。 |
| NumberDecimalDigits | 定義十進位數的預設數目。 您可以使用有效位數規範來覆寫此值。 |
下列範例會使用固定點格式規範來格式化 Double 和 Int32 值:
int integerNumber;
integerNumber = 17843;
Console.WriteLine(integerNumber.ToString("F",
CultureInfo.InvariantCulture));
// Displays 17843.00
integerNumber = -29541;
Console.WriteLine(integerNumber.ToString("F3",
CultureInfo.InvariantCulture));
// Displays -29541.000
double doubleNumber;
doubleNumber = 18934.1879;
Console.WriteLine(doubleNumber.ToString("F", CultureInfo.InvariantCulture));
// Displays 18934.19
Console.WriteLine(doubleNumber.ToString("F0", CultureInfo.InvariantCulture));
// Displays 18934
doubleNumber = -1898300.1987;
Console.WriteLine(doubleNumber.ToString("F1", CultureInfo.InvariantCulture));
// Displays -1898300.2
Console.WriteLine(doubleNumber.ToString("F3",
CultureInfo.CreateSpecificCulture("es-ES")));
// Displays -1898300,199
Dim integerNumber As Integer
integerNumber = 17843
Console.WriteLine(integerNumber.ToString("F", CultureInfo.InvariantCulture))
' Displays 17843.00
integerNumber = -29541
Console.WriteLine(integerNumber.ToString("F3", CultureInfo.InvariantCulture))
' Displays -29541.000
Dim doubleNumber As Double
doubleNumber = 18934.1879
Console.WriteLine(doubleNumber.ToString("F", CultureInfo.InvariantCulture))
' Displays 18934.19
Console.WriteLine(doubleNumber.ToString("F0", CultureInfo.InvariantCulture))
' Displays 18934
doubleNumber = -1898300.1987
Console.WriteLine(doubleNumber.ToString("F1", CultureInfo.InvariantCulture))
' Displays -1898300.2
Console.WriteLine(doubleNumber.ToString("F3", _
CultureInfo.CreateSpecificCulture("es-ES")))
' Displays -1898300,199
一般格式規範 (G)
一般 (“G”) 格式規範會根據數位的類型以及有效位數規範是否存在,將數字轉換成更精簡的固定點或科學表示法。 有效位數規範會定義可出現在結果字串中的有效位數上限。 如果省略有效位數規範或零,數位的類型會決定預設有效位數,如下表所示。
| 數值類型 | 預設有效位數 |
|---|---|
| Byte 或 SByte | 3 位數 |
| Int16 或 UInt16 | 5 位數 |
| Int32 或 UInt32 | 10 位數 |
| Int64 | 19 位數 |
| UInt64 | 20位數 |
| BigInteger | 沒有限制 (與 “R” 相同) |
| Half | 代表數位的最小來回次數 |
| Single | 代表數位的最小來回次數 (在 .NET Framework 中,G7 是預設值) |
| Double | 代表數位的最小來回次數 (在 .NET Framework 中,G15 是預設值) |
| Decimal | 代表數位的最小來回次數 |
如果在以科學表示法表示法來表示數位所產生的指數大於 -5 且小於有效位數規範,則會使用固定點表示法:否則會使用科學表示法。 如果必要,結果會包含小數點,並在省略小數點之後的尾端零。 如果有效位數規範存在,且結果中的有效位數超過指定的有效位數,則會透過四捨五入來移除多餘的尾端數位。
不過,如果數位為 Decimal ,而且省略有效位數規範,則一律使用固定點表示法,並保留尾端零。
如果使用科學表示法,如果格式規範為 “G”,則結果中的指數前面會加上 “E”,如果格式規範為 “g”,則為 “e”。 指數至少包含兩位數。 這與指數格式規範所產生的科學表示法格式不同,其中指數中至少包含三位數。
搭配 Double 值使用時,“G17” 格式規範可確保原始 Double 值已成功往返。 這是因為 Double IEEE 754-2008 相容雙精確度 (binary64) 浮點數,最多可提供 17 個有效位數的有效位數。 在 .NET Framework 上,我們建議使用 ,而不是 “R” 格式規範,因為在某些情況下,“R” 無法成功往返雙精確度浮點值。
搭配 Single 值使用時,“G9” 格式規範可確保原始 Single 值可以順利往返。 這是因為 Single IEEE 754-2008 相容單精度 (binary32) 浮點數,最多可提供 9 個有效位數的有效位數。 基於效能考慮,我們建議使用 ,而不是 “R” 格式規範。
結果字串會受到目前 NumberFormatInfo 物件的格式化資訊所影響。 下表列出 NumberFormatInfo 控制結果字串格式的屬性。
| NumberFormatInfo 屬性 | 說明 |
|---|---|
| NegativeSign | 定義字串,指出數位為負數。 |
| NumberDecimalSeparator | 定義分隔整數數位與十進位數的字串。 |
| PositiveSign | 定義表示指數為正數的字串。 |
下列範例會使用一般格式規範來格式化各種浮點值:
double number;
number = 12345.6789;
Console.WriteLine(number.ToString("G", CultureInfo.InvariantCulture));
// Displays 12345.6789
Console.WriteLine(number.ToString("G",
CultureInfo.CreateSpecificCulture("fr-FR")));
// Displays 12345,6789
Console.WriteLine(number.ToString("G7", CultureInfo.InvariantCulture));
// Displays 12345.68
number = .0000023;
Console.WriteLine(number.ToString("G", CultureInfo.InvariantCulture));
// Displays 2.3E-06
Console.WriteLine(number.ToString("G",
CultureInfo.CreateSpecificCulture("fr-FR")));
// Displays 2,3E-06
number = .0023;
Console.WriteLine(number.ToString("G", CultureInfo.InvariantCulture));
// Displays 0.0023
number = 1234;
Console.WriteLine(number.ToString("G2", CultureInfo.InvariantCulture));
// Displays 1.2E+03
number = Math.PI;
Console.WriteLine(number.ToString("G5", CultureInfo.InvariantCulture));
// Displays 3.1416
Dim number As Double
number = 12345.6789
Console.WriteLine(number.ToString("G", CultureInfo.InvariantCulture))
' Displays 12345.6789
Console.WriteLine(number.ToString("G", _
CultureInfo.CreateSpecificCulture("fr-FR")))
' Displays 12345,6789
Console.WriteLine(number.ToString("G7", CultureInfo.InvariantCulture))
' Displays 12345.68
number = .0000023
Console.WriteLine(number.ToString("G", CultureInfo.InvariantCulture))
' Displays 2.3E-06
Console.WriteLine(number.ToString("G", _
CultureInfo.CreateSpecificCulture("fr-FR")))
' Displays 2,3E-06
number = .0023
Console.WriteLine(number.ToString("G", CultureInfo.InvariantCulture))
' Displays 0.0023
number = 1234
Console.WriteLine(number.ToString("G2", CultureInfo.InvariantCulture))
' Displays 1.2E+03
number = Math.Pi
Console.WriteLine(number.ToString("G5", CultureInfo.InvariantCulture))
' Displays 3.1416
數值格式規範 (N)
數值 (“N”) 格式規範會將數字轉換成格式為 “-d,d,d.ddd...”的字串,其中 “-” 表示必要時為負數符號,“d” 表示數位 (0-9),“,”表示群組分隔符,而 “.” 表示小數點符號。 有效位數規範表示小數點之後所需的位數。 如果省略有效位數規範,則目前的 NumberFormatInfo.NumberDecimalDigits 屬性會定義小數字數。
結果字串會受到目前 NumberFormatInfo 物件的格式化資訊所影響。 下表列出 NumberFormatInfo 控制結果字串格式的屬性。
| NumberFormatInfo 屬性 | 說明 |
|---|---|
| NegativeSign | 定義字串,指出數位為負數。 |
| NumberNegativePattern | 定義負值的格式,並指定負號是以括弧或 NegativeSign 屬性表示。 |
| NumberGroupSizes | 定義群組分隔符之間出現的整數位數。 |
| NumberGroupSeparator | 定義分隔整陣群組的字串。 |
| NumberDecimalSeparator | 定義分隔整數和十進位數的字串。 |
| NumberDecimalDigits | 定義十進位數的預設數目。 您可以使用有效位數規範來覆寫此值。 |
下列範例會使用數位格式規範來格式化各種浮點值:
double dblValue = -12445.6789;
Console.WriteLine(dblValue.ToString("N", CultureInfo.InvariantCulture));
// Displays -12,445.68
Console.WriteLine(dblValue.ToString("N1",
CultureInfo.CreateSpecificCulture("sv-SE")));
// Displays -12 445,7
int intValue = 123456789;
Console.WriteLine(intValue.ToString("N1", CultureInfo.InvariantCulture));
// Displays 123,456,789.0
Dim dblValue As Double = -12445.6789
Console.WriteLine(dblValue.ToString("N", CultureInfo.InvariantCulture))
' Displays -12,445.68
Console.WriteLine(dblValue.ToString("N1", _
CultureInfo.CreateSpecificCulture("sv-SE")))
' Displays -12 445,7
Dim intValue As Integer = 123456789
Console.WriteLine(intValue.ToString("N1", CultureInfo.InvariantCulture))
' Displays 123,456,789.0
百分比格式規範 (P)
百分比 (“P”) 格式規範會將數位乘以 100,並將它轉換成代表百分比的字串。 有效位數規範表示所需的小數位數。 如果省略有效位數規範,則會使用目前 PercentDecimalDigits 屬性提供的預設數值有效位數。
下表列出 NumberFormatInfo 控制所傳回字串格式的屬性。
| NumberFormatInfo 屬性 | 說明 |
|---|---|
| PercentPositivePattern | 定義正值百分比符號的位置。 |
| PercentNegativePattern | 定義負值的百分比符號和負號的位置。 |
| NegativeSign | 定義字串,指出數位為負數。 |
| PercentSymbol | 定義百分比符號。 |
| PercentDecimalDigits | 定義百分比值中的預設十進位數。 您可以使用有效位數規範來覆寫此值。 |
| PercentDecimalSeparator | 定義分隔整數和十進位數的字串。 |
| PercentGroupSeparator | 定義分隔整陣群組的字串。 |
| PercentGroupSizes | 定義出現在群組中的整數位數。 |
下列範例會使用百分比格式規範來格式化浮點值:
double number = .2468013;
Console.WriteLine(number.ToString("P", CultureInfo.InvariantCulture));
// Displays 24.68 %
Console.WriteLine(number.ToString("P",
CultureInfo.CreateSpecificCulture("hr-HR")));
// Displays 24,68%
Console.WriteLine(number.ToString("P1", CultureInfo.InvariantCulture));
// Displays 24.7 %
Dim number As Double = .2468013
Console.WriteLine(number.ToString("P", CultureInfo.InvariantCulture))
' Displays 24.68 %
Console.WriteLine(number.ToString("P", _
CultureInfo.CreateSpecificCulture("hr-HR")))
' Displays 24,68%
Console.WriteLine(number.ToString("P1", CultureInfo.InvariantCulture))
' Displays 24.7 %
來回格式規範 (R)
來回 (“R”) 格式規範會嘗試確保轉換成字串的數值會剖析回相同的數值。 只有 Half、 Single、 Double和 BigInteger 型別才支援此格式。
在 .NET Framework 和 3.0 之前的 .NET Core 版本中,在某些情況下,“R” 格式規範無法成功往返 Double 值。 Double針對 和 Single 值,“R” 格式規範提供相對不佳的效能。 相反地,我們建議您針對值使用 Double 格式規範,並使用 「G9」 格式規範成功來回Single值。
BigInteger當值使用此規範格式化時,其字串表示會包含值中的所有BigInteger有效位數。
雖然您可以包含有效位數規範,但會被忽略。 使用這個規範時,來回行程的優先順序高於精確度。 結果字串會受到目前 NumberFormatInfo 物件的格式化資訊所影響。 下表列出 NumberFormatInfo 控制結果字串格式的屬性。
| NumberFormatInfo 屬性 | 說明 |
|---|---|
| NegativeSign | 定義字串,指出數位為負數。 |
| NumberDecimalSeparator | 定義分隔整數數位與十進位數的字串。 |
| PositiveSign | 定義表示指數為正數的字串。 |
下列範例會使用來回格式規範來格式化 BigInteger 值。
using System;
using System.Numerics;
public class Example
{
public static void Main()
{
var value = BigInteger.Pow(Int64.MaxValue, 2);
Console.WriteLine(value.ToString("R"));
}
}
// The example displays the following output:
// 85070591730234615847396907784232501249
Imports System.Numerics
Module Example
Public Sub Main()
Dim value = BigInteger.Pow(Int64.MaxValue, 2)
Console.WriteLine(value.ToString("R"))
End Sub
End Module
' The example displays the following output:
' 85070591730234615847396907784232501249
這很重要
在某些情況下,使用 或 Double 參數編譯並在 64 位系統上執行時,/platform:x64使用 /platform:anycpu “R” 標準數值格式字串格式化的值不會成功往返。 如需詳細資訊,請參閱下列段落。
若要解決使用 或 Double 參數編譯並在 64 位系統上執行時,使用 /platform:x64 “R” 標準數值格式字串格式化的值無法成功來回的問題/platform:anycpu,您可以使用 “G17” 標準數值格式字符串來格式化Double值。 下列範例會使用 「R」 格式字串搭配 Double 未成功往返的值,而且也會使用 「G17」 格式字串成功往返原始值:
Console.WriteLine("Attempting to round-trip a Double with 'R':");
double initialValue = 0.6822871999174;
string valueString = initialValue.ToString("R",
CultureInfo.InvariantCulture);
double roundTripped = double.Parse(valueString,
CultureInfo.InvariantCulture);
Console.WriteLine($"{initialValue:R} = {roundTripped:R}: {initialValue.Equals(roundTripped)}\n");
Console.WriteLine("Attempting to round-trip a Double with 'G17':");
string valueString17 = initialValue.ToString("G17",
CultureInfo.InvariantCulture);
double roundTripped17 = double.Parse(valueString17,
CultureInfo.InvariantCulture);
Console.WriteLine($"{initialValue:R} = {roundTripped17:R}: {initialValue.Equals(roundTripped17)}\n");
// If compiled to an application that targets anycpu or x64 and run on an x64 system,
// the example displays the following output:
// Attempting to round-trip a Double with 'R':
// .NET Framework:
// 0.6822871999174 = 0.68228719991740006: False
// .NET:
// 0.6822871999174 = 0.6822871999174: True
//
// Attempting to round-trip a Double with 'G17':
// 0.6822871999174 = 0.6822871999174: True
Imports System.Globalization
Module Example
Public Sub Main()
Console.WriteLine("Attempting to round-trip a Double with 'R':")
Dim initialValue As Double = 0.6822871999174
Dim valueString As String = initialValue.ToString("R",
CultureInfo.InvariantCulture)
Dim roundTripped As Double = Double.Parse(valueString,
CultureInfo.InvariantCulture)
Console.WriteLine("{0:R} = {1:R}: {2}",
initialValue, roundTripped, initialValue.Equals(roundTripped))
Console.WriteLine()
Console.WriteLine("Attempting to round-trip a Double with 'G17':")
Dim valueString17 As String = initialValue.ToString("G17",
CultureInfo.InvariantCulture)
Dim roundTripped17 As Double = double.Parse(valueString17,
CultureInfo.InvariantCulture)
Console.WriteLine("{0:R} = {1:R}: {2}",
initialValue, roundTripped17, initialValue.Equals(roundTripped17))
End Sub
End Module
' If compiled to an application that targets anycpu or x64 and run on an x64 system,
' the example displays the following output:
' Attempting to round-trip a Double with 'R':
' .NET Framework:
' 0.6822871999174 = 0.68228719991740006: False
' .NET:
' 0.6822871999174 = 0.6822871999174: True
'
' Attempting to round-trip a Double with 'G17':
' 0.6822871999174 = 0.6822871999174: True
十六進位格式規範 (X)
十六進位 (“X”) 格式規範會將數字轉換成十六進位數位的字串。 格式規範的案例會指出是否針對大於9的十六進位數位使用大寫或小寫字元。 例如,使用 「X」 來產生 「ABCDEF」 和 「x」 來產生 「abcdef」。 只有整數型別才支援此格式。
有效位數規範表示所產生字串中所需的最小位數。 如有需要,數位會以左邊的零填補,以產生有效位數規範所指定的位數。
針對 BigInteger,正值一律有前置零,以區別其與負值。 這可確保剖析時輸出往返原始值。 例如,使用格式規範轉換的數位F是因為"X1"十六進位數位0F代表負值 F。-1
結果字串不會受到目前 NumberFormatInfo 物件的格式化信息影響。
下列範例會使用十六進位格式規範來格式化 Int32 值。
int value;
value = 0x2045e;
Console.WriteLine(value.ToString("x"));
// Displays 2045e
Console.WriteLine(value.ToString("X"));
// Displays 2045E
Console.WriteLine(value.ToString("X8"));
// Displays 0002045E
value = 123456789;
Console.WriteLine(value.ToString("X"));
// Displays 75BCD15
Console.WriteLine(value.ToString("X2"));
// Displays 75BCD15
Dim value As Integer
value = &h2045e
Console.WriteLine(value.ToString("x"))
' Displays 2045e
Console.WriteLine(value.ToString("X"))
' Displays 2045E
Console.WriteLine(value.ToString("X8"))
' Displays 0002045E
value = 123456789
Console.WriteLine(value.ToString("X"))
' Displays 75BCD15
Console.WriteLine(value.ToString("X2"))
' Displays 75BCD15
備註
本節包含使用標準數值格式字串的其他資訊。
控制面板設定
[控制面板] 中 [地區及語言選項 ] 專案中的設定會影響格式化作業所產生的結果字串。 這些設定可用來初始化 NumberFormatInfo 與目前文化特性相關聯的物件,以提供用來控管格式設定的值。 使用不同設定的計算機會產生不同的結果字串。
此外,如果建 CultureInfo(String) 構函式用來具現化代表與目前系統文化特性相同文化特性的新 CultureInfo 物件,則 [控制面板] 中 [地區及語言選項 ] 專案所建立的任何自定義專案都會套用至新的 CultureInfo 物件。 您可以使用 建 CultureInfo(String, Boolean) 構函式來建立 CultureInfo 不會反映系統自訂的物件。
NumberFormatInfo 屬性
格式設定會受到目前 對象的屬性所影響,而目前 NumberFormatInfo 文化特性會隱含地提供,或是由 IFormatProvider 叫用格式化之方法的 參數明確提供。 NumberFormatInfo為該參數指定 或 CultureInfo 物件。
備註
如需自定義格式化數值中使用的模式或字串的相關信息,請參閱 NumberFormatInfo 類別主題。
整數和浮點數值類型
標準數值格式規範的某些描述是指整數或浮點數值類型。 整數數值類型為 Byte、、、SByteInt16、Int32、Int64、 UInt16和 UInt32UInt64BigInteger 浮點數值類型為Decimal、、 HalfSingle和 Double。
浮點無限和 NaN
不論格式字串為何,如果 、 Half或 浮點類型的值Single是正無限大、負無限大,或不是數位 (NaN),格式化字串就是目前適用Double物件所指定的個別PositiveInfinitySymbol、 NegativeInfinitySymbol或 NaNSymbol 屬性NumberFormatInfo的值。
程式代碼範例
下列範例會使用 en-US 文化特性和所有標準數值格式規範來格式化整數和浮點數值。 這個範例使用兩個特定的數值類型 (Double和 ),但會產生任何其他數值基底類型的類似結果(Int32、、 ByteSByteInt16Int32Int64UInt16UInt32UInt64BigIntegerDecimal和 )。HalfSingle
// 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: {floating.ToString("C", ci)}"); // Displays "C: $10,761.94"
Console.WriteLine($"E: {floating.ToString("E03", ci)}"); // Displays "E: 1.076E+004"
Console.WriteLine($"F: {floating.ToString("F04", ci)}"); // Displays "F: 10761.9376"
Console.WriteLine($"G: {floating.ToString("G", ci)}"); // Displays "G: 10761.937554"
Console.WriteLine($"N: {floating.ToString("N03", ci)}"); // Displays "N: 10,761.938"
Console.WriteLine($"P: {(floating/10000).ToString("P02", ci)}"); // Displays "P: 107.62 %"
Console.WriteLine($"R: {floating.ToString("R", ci)}"); // Displays "R: 10761.937554"
Console.WriteLine();
// Output integral values
int integral = 8395;
Console.WriteLine($"C: {integral.ToString("C", ci)}"); // Displays "C: $8,395.00"
Console.WriteLine($"D: {integral.ToString("D6", ci)}"); // Displays "D: 008395"
Console.WriteLine($"E: {integral.ToString("E03", ci)}"); // Displays "E: 8.395E+003"
Console.WriteLine($"F: {integral.ToString("F01", ci)}"); // Displays "F: 8395.0"
Console.WriteLine($"G: {integral.ToString("G", ci)}"); // Displays "G: 8395"
Console.WriteLine($"N: {integral.ToString("N01", ci)}"); // Displays "N: 8,395.0"
Console.WriteLine($"P: {(integral/10000.0).ToString("P02", ci)}"); // Displays "P: 83.95 %"
Console.WriteLine($"X: 0x{integral.ToString("X", ci)}"); // Displays "X: 0x20CB"
Console.WriteLine();
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