标准数字格式解析精度

.NET 现在支持使用 ToStringTryFormat 将数字格式化为字符串时的更高精度值。

注释

.NET 7 中再次更改了最大精度。 有关详细信息,请参阅 数值格式字符串的最大精度

更改描述

将数字的格式设置为字符串时,格式字符串中的精度说明符表示生成的字符串中的数字数。 根据 格式说明符(字符串 开头的字符),精度可以表示数字总数、有效位数或小数位数。

在以前的 .NET 版本中,标准数值格式分析逻辑限制为 99 或更低精度。 某些数值类型具有更高的精度,但 ToString(string format) 未正确公开它。 例如,如果指定精度大于 99, 32.ToString("C100")则格式字符串将解释为 自定义数字格式字符串 ,而不是“精度为 100 的货币”。 在自定义数字格式字符串中,字符被解释为 字符文本。 此外,包含无效格式说明符的格式字符串根据精度值以不同的方式解释。 H99 会对无效的格式说明符引发 FormatException,而 H100 被解释为自定义数字格式字符串。

从 .NET 6 开始,.NET 支持高达 Int32.MaxValue 的精度。 包含任意数字的格式说明符的格式字符串被解释为具有精度的标准数字格式字符串。 对于下述任一或两种情况,会引发 FormatException

此更改是在影响所有数值类型的分析逻辑中实现的。

下表显示了各种格式字符串的行为更改。

格式字符串 以前的行为 .NET 6 及更高版本中的行为
C2 表示具有两个十进制数字的货币 表示具有两个十进制数字的货币(无变化
C100 表示打印“C100”的自定义数值格式字符串 表示具有 100 位十进制数字的货币
H99 由于存在无效的标准格式说明符“H”,引发 FormatException 由于存在无效的标准格式说明符“H”,引发 FormatException(无更改
H100 表示自定义数字格式字符串 由于存在无效的标准格式说明符“H”,引发 FormatException

已引入的版本

.NET 6

更改原因

当对数字格式分析使用更高的精度时,此更改将更正意外行为。

在大多数情况下,无需执行任何作,生成的字符串中会显示正确的精度。

不过,如果想要还原到之前的行为(即当精度高于 99 时,格式说明符被解释为文本字符),可将字符用单引号引起来或使用反斜杠对其进行转义。 例如,在以前的 .NET 版本中, 42.ToString("G999") 返回 G999。 若要保持该行为,请将格式字符串更改为 "'G'999""\\G999"。 这将适用于 .NET Framework、.NET Core 和 .NET 5+。

以下格式字符串将继续解释为自定义数字格式字符串:

  • 以不是 ASCII 字母字符的任何字符开头,例如或 $è
  • 以 ASCII 字母字符开头但后面不跟 ASCII 数字,例如 A$
  • 以 ASCII 字母字符开头,接着是 ASCII 数字序列,然后是任何非 ASCII 数字字符,例如 A12A

受影响的 API

此更改是在影响所有数值类型的分析逻辑中实现的。

另请参阅