标准数字格式字符串

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

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

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

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

    注释

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

标准数值格式字符串支持:

小提示

可以下载 格式设置实用工具,这是一个 .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
    
  • 它可以作为格式项中的 formatString 参数提供,用于诸如 String.FormatConsole.WriteLineStringBuilder.AppendFormat等方法。 有关详细信息,请参阅 复合格式。 以下示例使用格式项在字符串中插入货币值。

    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 {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 个字符的字段中右对齐货币值。

    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 类型。

在 .NET Framework 和低于 3.0 的 .NET Core 版本中,在某些情况下,“R”格式说明符无法成功往返 Double 值。 对于 DoubleSingle 值,“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  

重要

在某些情况下 Double,如果使用 /platform:x64 编译或 /platform:anycpu 开关在 64 位系统上运行,则使用“R”标准数字格式字符串格式化的值不会成功往返。 有关详细信息,请参阅以下段落。

若要解决使用“R”标准数字格式字符串格式化的 Double 值的问题,如果使用 /platform:x64/platform:anycpu 开关编译并在 64 位系统上运行,则可以使用“G17”标准数字格式字符串格式化 Double 值。 以下示例使用具有 Double 值(不成功往返)的“R”格式字符串,并使用“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”。 只有整型才支持此格式。

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

结果字符串不受当前 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: {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

另请参阅