標準數值格式字串
標準數值格式字串會用來格式化一般數字類型。 標準數值格式字串會採用 [format specifier][precision specifier]
格式,其中:
格式規範是單一字母字元,指定數字格式的類型,例如貨幣或百分比。 任何包含一個以上字母字元 (包含泛空白字元 (White Space)) 的數值格式字串都會解譯為自訂數值格式字串。 如需詳細資訊,請參閱自訂數值格式字串。
精確度規範是會影響所產生字串中位數的選擇性整數。 在 .NET 7 和更新版本中,最大有效位數值為 999,999,999。 在 .NET 6 中,最大有效位數值為 Int32.MaxValue 。 在舊版 .NET 中,精確度的範圍可以從 0 到 99。 精確度規範負責控制數字之字串表示中的位數。 它不會捨入數字本身。 若要執行捨入運算,請使用 Math.Ceiling、Math.Floor 或 Math.Round 方法。
當「有效位數規範」控制結果字串中小數點後的位數,結果字串會反映已四捨五入為最接近無限精確度之可代表結果的數字。 若有兩個相等的近似可代表結果:
- 在.NET Framework和最多 .NET Core 2.0 的 .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 的複合格式功能,此功能會由 Console 與 StreamWriter 類別的一些
Write
和WriteLine
方法,以及 String.Format 方法和 StringBuilder.AppendFormat 方法所使用。 複合格式功能可讓您將多個資料項目的字串表示法包含在單一字串中,以指定欄位寬度,以及對齊欄位中的數字。 如需詳細資訊,請參閱複合格式設定。C# 和 Visual Basic 中的字串插值,相較於複合格式字串,其可提供簡化的語法。
提示
您可以下載格式化公用程式,這個 .NET Core Windows Forms 應用程式可讓您將格式字串套用至數值或日期和時間值,並顯示結果字串。 提供 C# 和 Visual Basic 的原始程式碼。
標準格式規範
下表描述標準數值格式規範,並顯示每個格式範例所產生的範例輸出。 如需使用標準數值格式字串的詳細資訊,請參閱備註一節,如需其用法的完整解說,請參閱程式碼範例一節。
特定文化特性的格式化字串結果可能與下列範例不同。 您所使用的作業系統設定、使用者設定、環境變數和 .NET 版本都可能會影響格式。 例如,從 .NET 5 開始,.NET 會嘗試跨平臺統一文化格式。 如需詳細資訊,請參閱 .NET 全球化和 ICU。
格式規範 | 名稱 | 描述 | 範例 |
---|---|---|---|
「B」 或 「b」 | Binary | 結果:二進位字串。 支援者:僅限整數類型 (.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 定義。 詳細資訊:固定點 ("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,00 % -0.39678 ("P1", en-US) -> -39.7 % -0.39678 ("P1", fr-FR) -> -39,7 % |
"R" 或 "r" | 來回 | 結果:可以來回轉換為相同數字的字串。 支援的類型:Single、Double 和 BigInteger。 注意:建議僅用於 BigInteger 類型。 針對 Double 類型,使用 "G17";針對 Single 類型,使用 "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 |
任何其他單一字元 | 未知的規範 | 結果:在執行階段擲回 FormatException。 |
使用標準數值格式字串
注意
本文中的 C# 範例會在 Try.NET 內嵌程式碼執行器和測試區執行。 選取 [執行] 按鈕以在互動式視窗中執行範例。 執行程式碼之後,您便可以修改它,並再選取一次 [執行] 來執行修改過的程式碼。 修改過的程式碼會在互動式視窗中執行,或是如果編譯失敗的話,互動式視窗會顯示所有 C# 編譯器錯誤訊息。
使用標準數值格式字串來定義數值的格式有下列其中一種方式:
您可以將它傳遞至
TryFormat
方法或具有format
參數之ToString
方法的多載。 下列範例會以目前的文化特定 (在此範例中是 en-US 文化特性) 來將數值格式化為貨幣字串。Decimal value = static_cast<Decimal>(123.456); Console::WriteLine(value.ToString("C2")); // Displays $123.46
decimal value = 123.456m; Console.WriteLine(value.ToString("C2")); // Displays $123.46
Dim value As Decimal = 123.456d Console.WriteLine(value.ToString("C2")) ' Displays $123.46
您可以在搭配 String.Format、Console.WriteLine 和 StringBuilder.AppendFormat 等方法一起使用的格式項目中,提供它作為
formatString
引數。 如需詳細資訊,請參閱複合格式設定。 下列範例會使用格式項目,在字串中插入貨幣值。Decimal value = static_cast<Decimal>(123.456); Console::WriteLine("Your account balance is {0:C2}.", value); // Displays "Your account balance is $123.46."
decimal value = 123.456m; Console.WriteLine("Your account balance is {0:C2}.", value); // 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 個字元的欄位中將貨幣值靠右對齊。array<Decimal>^ amounts = { static_cast<Decimal>(16305.32), static_cast<Decimal>(18794.16) }; 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
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.16
Dim 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+才支援此格式。
精確度規範指示產生的字串中所需要的最少位數。 如果有必要,數值以零填補其左邊,產生精確度規範所指定的位數。
結果字串不受目前 NumberFormatInfo 物件的格式設定資訊所影響。
貨幣格式規範 (C)
"C" (表示貨幣) 格式規範會將數字轉換為表示貨幣金額的字串。 精確度規範表示在結果字串中所需要的小數位數。 如果省略精確度規範,則預設有效位數會由 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
// kr 12.345,679
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" (表示十進位) 格式規範會將數字轉換為十進位數 (0-9) 的字串,如果數字為負數,則在前面加上負號。 只有整數類資料類型 (Integral Type) 才支援這個格式。
精確度規範指示產生的字串中所需要的最少位數。 如果有必要,數值以零填補其左邊,產生精確度規範所指定的位數。 如果未指定精確度規範,則預設值為在不填補前置零的情況下,表示整數所需的最小值。
結果字串會受到目前 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
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
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
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,而且省略精確度規範,則一律會使用固定點標記法,並且保留尾端的零。
使用科學標記法時,結果中的指數前面會加上 "E" (如果格式規範為 "G") 或 "e" (如果格式規範為 "g")。 指數至少包含兩位數。 這不同於指數格式規範所產生的科學標記法格式,此格式會在指數中包含至少三位數。
搭配 Double 值使用時,"G17" 格式規範會確保原始的 Double 值可成功地反覆存取。 這是因為 Double 是符合 IEEE 754-2008 規範的雙精確度 (binary64
) 浮點數,可提供最多 17 個有效位數的精確度。 在.NET Framework上,我們建議使用,而不是 「R」 格式規範,因為在某些情況下,「R」 無法成功往返雙精確度浮點數。
搭配 Single 值使用時,"G9" 格式規範會確保原始的 Single 值可成功地反覆存取。 這是因為 Single 是符合 IEEE 754-2008 規範的單精確度 (binary32
) 浮點數,可提供最多九個有效位數的精確度。 基於效能考量,我們建議使用它,而不要使用 "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
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,ddd,ddd.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
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 %
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 值改用 "G17" 格式規範以及 "G9" 格式規範,以便成功地反覆存取 Single 值。
使用這個規範來格式化 BigInteger 值時,這個值的字串表示會包含 BigInteger 值中的所有有效位數。
雖然您可以包含精確度規範,但該規範會被忽略。 使用來回規範時,這個規範優先於精確度規範。 結果字串會受到目前 NumberFormatInfo 物件的格式設定資訊所影響。 下表列出可控制結果字串之格式設定的 NumberFormatInfo 屬性。
NumberFormatInfo 屬性 | 描述 |
---|---|
NegativeSign | 定義表示數字為負數的字串。 |
NumberDecimalSeparator | 定義分隔整數位數與小數位數的字串。 |
PositiveSign | 定義表示指數為正數的字串。 |
下列範例會使用反覆存取格式規範來將 BigInteger 值格式化。
#using <System.Numerics.dll>
using namespace System;
using namespace System::Numerics;
void main()
{
BigInteger value = BigInteger::Pow(Int64::MaxValue, 2);
Console::WriteLine(value.ToString("R"));
}
// The example displays the following output:
// 85070591730234615847396907784232501249
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
重要
在某些情況下,使用 "R" 標準數值格式字串格式化的 Double 值,如果使用 /platform:x64
或 /platform:anycpu
參數編譯並在 64 位元系統上執行,則不會成功地反覆存取。 如需詳細資訊,請參閱下一段內容。
若要解決以 "R" 標準數值格式字串格式化的 Double 值,在使用 /platform:x64
或 /platform:anycpu
參數編譯並於 64 位元系統上執行時,不會成功地反覆存取的問題,您可以使用 "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("{0:R} = {1:R}: {2}\n",
initialValue, roundTripped, initialValue.Equals(roundTripped));
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("{0:R} = {1:R}: {2}\n",
initialValue, roundTripped17, initialValue.Equals(roundTripped17));
// 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"。 只有整數類資料類型 (Integral Type) 才支援這個格式。
精確度規範指示產生的字串中所需要的最少位數。 如果有必要,數值以零填補其左邊,產生精確度規範所指定的位數。
結果字串不受目前 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
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、SByte、Int16、Int32、Int64、UInt16、UInt32、UInt64 和 BigInteger。 浮點數值類型有 Decimal、Half、Single 和 Double。
無限浮點數與 NaN
不論格式字串為何,如果 Half、Single 或 Double 浮點類型的值為正無限大、負無限大或不是數字 (NaN),則格式化後的字串會分別是 PositiveInfinitySymbol、NegativeInfinitySymbol 或 NaNSymbol 屬性的值 (這些屬性由目前適用的 NumberFormatInfo 物件所指定)。
程式碼範例
下列範例會使用 en-US 文化特性和所有標準數值格式規範來格式化整數和浮點數值。 這個範例使用兩個特定的數字類型 (Double 和 Int32),但用於其他任何數字基底類型 (Byte、SByte、Int16、Int32、Int64、UInt16、UInt32、UInt64、BigInteger、Decimal、Half 和 Single) 也會產生類似的結果。
// 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.0).ToString("P02", ci)); // Displays "P: 83.95 %"
Console.WriteLine("X: 0x{0}",
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