标准数字格式字符串

标准数字格式字符串用于格式化通用数值类型。 标准数字格式字符串采用 [format specifier][precision specifier] 的形式,其中:

  • 格式说明符是指定数字格式类型(例如货币或百分比)的单个字母字符。 任何包含一个以上字母字符(包括空白)的数字格式字符串都被解释为自定义数字格式字符串。 有关详细信息,请参阅自定义数字格式字符串

  • 精度说明符是一个可选整数,它影响生成的字符串中的位数。 在 .NET 7 及更高版本中,最大精度值为 999,999,999。 在 .NET 6 中,最大精度值为 Int32.MaxValue。 在旧版 .NET 中,精度范围可以为 0 到 99。 精度说明符控制数字的字符串表示形式中的数字个数。 它不舍入该数字。 若要执行舍入运算,请使用 Math.CeilingMath.FloorMath.Round 方法。

    当精度说明符控制结果字符串中的小数位数时,结果字符串会反映一个数字,该数字四舍五入到最接近无限精确结果的可表示结果。 如果有两个同样接近的可表示结果:

    • 在 .NET Framework 和.NET Core(.NET Core 2.0 及以下)上,运行时选择最低有效数字更高的结果(即使用 MidpointRounding.AwayFromZero)。
    • 在 .NET Core 2.1 及更高版本上,运行时选择最低有效数字为偶数的结果(即使用 MidpointRounding.ToEven)。

    注意

    精度说明符确定结果字符串中的位数。 若要使用前导或尾随空格填充结果字符串,请使用复合格式设置功能,并在格式项中定义对齐组件

下列支持标准数字格式字符串:

提示

你可以下载格式设置实用工具,它属于一种 .NET Core Windows 窗体应用程序,通过该应用程序,你可将格式字符串应用于数值或日期和时间值并显示结果字符串。 源代码适用于 C#Visual Basic

标准格式说明符

下表描述标准的数字格式说明符并显示由每个格式说明符产生的示例输出。 有关使用标准数字格式字符串的其他信息,请参见注释一节;有关使用方法的完整演示,请参见代码示例一节。

特定区域性的格式化字符串的结果可能与以下示例不同。 操作系统设置、用户设置、环境变量和所用的 .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” 十进制 结果:整型数字,负号可选。

受以下类型支持:仅限整型类型。

精度说明符:数字位数下限。

默认值精度说明符:所需数字位数下限。

更多信息:十进制(“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” 往返过程 结果:可以往返至相同数字的字符串。

受以下类型支持:SingleDoubleBigInteger

注意:建议只用于 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.FormatConsole.WriteLineStringBuilder.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) 的字符串,如果数字为负,则前面加负号。 只有整型才支持此格式。

精度说明符指示结果字符串中所需的最少数字个数。 如果需要的话,则用零填充该数字的左侧,以产生精度说明符给定的数字个数。 如果未指定精度说明符,则默认值为表示不带前导零的整数所需的最小值。

结果字符串受当前 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 定义默认小数位数。 可使用精度说明符重写此值。

下面的示例使用定点格式说明符设置 DoubleInt32 值的格式:

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”)格式说明符将数字转换为更紧凑的定点表示法或科学记数法。 精度说明符定义可以出现在结果字符串中的最大有效位数。 如果精度说明符被省略或为零,则数字的类型决定默认精度,如下表所示。

数值类型 默认值精度
ByteSByte 3 位
Int16UInt16 5 位
Int32UInt32 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    
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") 格式说明符试图确保将转换为字符串的数值分析回相同的数值。 只有 HalfSingleDoubleBigInteger 类型支持此格式。

在低于 3.0 的 .NET Framework 和 .NET Core 版本中,在某些情况下,“R”格式说明符无法成功往返传送 Double 值。 对于 Double 值和 Single 值,“R”格式说明符提供相对较差的性能。 建议改用 "G17" 格式说明符以成功往返 Double 值,并改用 "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':
//       0.6822871999174 = 0.68228719991740006: False
//
//       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':
'       0.6822871999174 = 0.68228719991740006: False
'
'       Attempting to round-trip a Double with 'G17':
'       0.6822871999174 = 0.6822871999174: True

十六进制格式说明符 (X)

十六进制(“X”)格式说明符将数字转换为十六进制数的字符串。 格式说明符的大小写指示对大于 9 的十六进制数使用大写字符还是小写字符。 例如,使用“X”产生“ABCDEF”,使用“x”产生“abcdef”。 只有整型才支持此格式。

精度说明符指示结果字符串中所需的最少数字个数。 如果需要的话,则用零填充该数字的左侧,以产生精度说明符给定的数字个数。

结果字符串不受当前 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 参数显式提供。 为该参数指定 NumberFormatInfoCultureInfo 对象。

注意

有关自定义用于格式化数值的模式或字符串的信息,请参见 NumberFormatInfo 类主题。

整型和浮点型数值类型

对标准数字格式说明符的一些说明涉及到整型或浮点型数值类型。 整型数值类型包括 ByteSByteInt16Int32Int64UInt16UInt32UInt64BigInteger。 浮点型数值类型有 DecimalHalfSingleDouble

浮点型无穷大和 NaN

无论格式字符串原来是什么值,只要 HalfSingleDouble 浮点类型的值为正无穷大、负无穷大或非数值 (NaN),格式字符串就分别是当前适用的 NumberFormatInfo 对象指定的 PositiveInfinitySymbolNegativeInfinitySymbolNaNSymbol 属性的值。

代码示例

下面的示例使用 en-US 区域性和所有标准数字格式说明符设置一个整型数值和一个浮点型数值的格式。 此示例使用两个特定的数值类型(DoubleInt32),但对于任何一个其他数值基类型(ByteSByteInt16Int32Int64UInt16UInt32UInt64BigIntegerDecimalHalfSingle)都将产生类似的结果。

// 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

请参阅