Precisión del análisis de formato numérico estándar

.NET ahora admite valores de precisión mayores al dar formato a los números como cadenas mediante ToString y TryFormat.

Nota

La precisión máxima se cambió de nuevo en .NET 7. A fin de obtener más información, vea Precisión máxima para cadenas de formato numérico.

Descripción del cambio

Al dar formato a los números como cadenas, el especificador de precisión en la cadena de formato representa el número de dígitos de la cadena resultante. Dependiendo del especificador de formato, que es el carácter situado al principio de la cadena, la precisión puede representar el número total de dígitos, el número de dígitos significativos o el número de dígitos decimales.

En versiones anteriores de .NET, la lógica de análisis de formato numérico estándar se limita a una precisión de 99 o menos. Algunos tipos numéricos tienen más precisión, pero ToString(string format) no los expone correctamente. Si especifica una precisión mayor que 99, por ejemplo 32.ToString("C100"), la cadena de formato se interpreta como una cadena de formato numérico personalizado en lugar de "moneda con precisión 100". En las cadenas de formato numérico personalizado, los caracteres se interpretan como literales de carácter. Además, una cadena de formato que contiene un especificador de formato no válido se interpreta de manera diferente en función del valor de precisión. H99 genera FormatException para el especificador de formato no válido, mientras que H100 se interpreta como una cadena de formato numérico personalizado.

A partir de .NET 6, .NET admite una precisión de hasta Int32.MaxValue. Una cadena de formato que consta de un especificador de formato con cualquier número de dígitos se interpreta como una cadena de formato numérico estándar con precisión. Se produce FormatException para una o ambas de las condiciones siguientes:

Este cambio se implementó en la lógica de análisis que afecta a todos los tipos numéricos.

En la tabla siguiente se muestran los cambios de comportamiento de varias cadenas de formato.

Cadena de formato Comportamiento anterior Comportamiento a partir de .NET 6
C2 Denota moneda con dos dígitos decimales Denota moneda con dos dígitos decimales (sin cambios)
C100 Denota una cadena de formato numérico personalizado que imprime "C100" Denota moneda con 100 dígitos decimales
H99 Se produce FormatException debido al especificador de formato estándar no válido "H" Se produce FormatException debido al especificador de formato estándar no válido "H" (sin cambios)
H100 Denota una cadena de formato numérico personalizado Se produce FormatException debido al especificador de formato estándar no válido "H"

Versión introducida

.NET 6

Motivo del cambio

Este cambio corrige el comportamiento inesperado al usar una precisión mayor para el análisis de formato numérico.

En la mayoría de los casos, no es necesario realizar ninguna acción y se mostrará la precisión correcta en las cadenas resultantes.

Sin embargo, si desea revertir al comportamiento anterior en el que el especificador de formato se interpreta como un carácter literal cuando la precisión es mayor que 99, puede especificar ese carácter entre comillas simples o escaparlo con una barra diagonal inversa. Por ejemplo, en versiones anteriores de .NET, 42.ToString("G999") devuelve G999. Para mantener ese comportamiento, cambie la cadena de formato a "'G'999" o "\\G999". Esto funcionará en .NET Framework, .NET Core y .NET 5 y versiones posteriores.

Las cadenas de formato siguientes se seguirán interpretando como cadenas de formato numérico personalizado:

  • Comienzan con cualquier carácter que no sea un carácter alfabético ASCII, por ejemplo $ o è.
  • Comienzan con un carácter alfabético ASCII no seguido de un dígito ASCII, por ejemplo A$.
  • Comienzan con un carácter alfabético ASCII, seguido de una secuencia de dígitos ASCII y, a continuación, cualquier carácter que no sea un carácter de dígito ASCII, por ejemplo A12A.

API afectadas

Este cambio se implementó en la lógica de análisis que afecta a todos los tipos numéricos.

Vea también