Cadenas con formato numérico estándar
Actualización: noviembre 2007
Las cadenas de formato numérico estándar se utilizan para dar formato a tipos numéricos comunes. Una cadena de formato numérico estándar presenta la forma Axx, donde A es un carácter alfabético que recibe el nombre de especificador de formato y xx es un entero opcional que recibe el nombre de especificador de precisión. El especificador de precisión está comprendido entre el 0 y el 99 y afecta al número de dígitos del resultado. Cualquier cadena de formato numérico que contenga más de un carácter alfabético, incluido el espacio en blanco, se interpreta como una cadena de formato numérico personalizado.
En la tabla siguiente se describen los especificadores de formato numérico estándar y se muestran los resultados de ejemplo generados por cada especificador de formato. Para obtener más información, vea las notas a continuación de la tabla.
Especificador de formato |
Nombre |
Descripción |
---|---|---|
C o c |
Moneda |
El número se convierte en una cadena que representa una cantidad de moneda. La conversión se controla mediante la información de formato de moneda del objeto NumberFormatInfo actual. El especificador de precisión indica el número deseado de cifras decimales. Si se omite el especificador de precisión, se utiliza la precisión de moneda predeterminada especificada en el objeto NumberFormatInfo actual. En el ejemplo siguiente se da formato a un valor Double con el especificador de formato de moneda.
|
D o d |
Decimal |
Este formato sólo es compatible con los tipos enteros. El número se convierte en una cadena de dígitos decimales (0-9), precedida por un signo menos si el número es negativo. El especificador de precisión indica el número mínimo de dígitos deseado en la cadena resultante. Si es preciso, el número se rellena con ceros a la izquierda para generar el número de dígitos que aporta el especificador de precisión. En el ejemplo siguiente se da formato a un valor Int32 con el especificador de formato decimal.
|
E o e |
Científico (exponencial) |
El número se convierte en una cadena de caracteres del tipo "-d.ddd…E+ddd" o "-d.ddd…e+ddd", donde cada 'd' indica un dígito (0-9). La cadena comienza con un signo menos si el número es negativo. El separador decimal siempre va precedido por un dígito. El especificador de precisión indica el número deseado de dígitos después del separador decimal. Si se omite el especificador de precisión, se emplea uno predeterminado que tiene seis dígitos después del separador decimal. La mayúscula o minúscula del especificador de formato indica si debemos prefijar el exponente con una 'E' o con una 'e'. El exponente siempre consta de un signo más o menos y de un mínimo de tres dígitos. El exponente se rellena con ceros para adaptarlo a este mínimo, si es necesario. En el ejemplo siguiente se da formato a un valor Double con el especificador de formato científico.
|
F o f |
Punto fijo |
El número se convierte en una cadena del tipo "-ddd.ddd…", donde cada 'd' indica un dígito (0-9). La cadena comienza con un signo menos si el número es negativo. El especificador de precisión indica el número deseado de cifras decimales. Si se omite el especificador de precisión, la precisión numérica predeterminada se especifica en la propiedad NumberDecimalDigits del objeto NumberFormatInfo actual. En el ejemplo siguiente se da formato a un valor Double e Int32 con el especificador de formato de punto fijo.
|
G o g |
General |
El número se convierte al punto fijo o la notación científica más compactos, dependiendo del tipo de número y de si hay un especificador de precisión. Si se omite el especificador de precisión o es cero, el tipo de número determina la precisión predeterminada, tal como se indica en la lista siguiente. La notación de punto fijo se utiliza si el exponente que resultaría de la expresión del número en notación científica es mayor que -5 y menor que el especificador de precisión, de lo contrario se utiliza la notación científica. El resultado contiene un punto decimal si es necesario y se omiten los ceros finales. Si está presente el especificador de precisión y el número de dígitos significativos del resultado supera la precisión especificada, los dígitos finales sobrantes se eliminan mediante el redondeo. La excepción a la regla anterior ocurre cuando el número es un valor Decimal y se omite el especificador de precisión. En tal caso, se utiliza siempre la notación de punto fijo y se conservan los ceros finales. Si se utiliza la notación científica, el exponente en el resultado lleva el prefijo "E" si el especificador de formato es "G", o "e" si el especificador de formato es "g". En el ejemplo siguiente se da formato a valores de punto flotante ordenados con el especificador de formato general.
|
N o n |
Número |
El número se convierte en una cadena con la forma "-d,ddd,ddd.ddd…", donde '-' hace referencia a un símbolo de número negativo, si es necesario; 'd', a un dígito (0-9); ',', al separador de miles entre los grupos de números; y '.' al símbolo de separador decimal. El modelo de números negativos, el tamaño del grupo de número, el separador de miles y el separador decimal se especifican mediante las propiedades NumberNegativePattern, NumberGroupSizes, NumberGroupSeparator y NumberDecimalSeparator, respectivamente, del objeto NumberFormatInfo actual. El especificador de precisión indica el número deseado de cifras decimales. Si se omite el especificador de precisión, la precisión numérica predeterminada se especifica en la propiedad NumberDecimalDigits del objeto NumberFormatInfo actual. En el ejemplo siguiente se da formato a valores de punto flotante ordenados con el especificador de formato numérico.
|
P o p |
Porcentaje |
El número se convierte en una cadena que representa un porcentaje, tal como se define en la propiedad NumberFormatInfo.PercentNegativePattern si el número es negativo o en la propiedad NumberFormatInfo.PercentPositivePattern si el número es positivo. El número convertido se multiplica por 100 para presentarlo como un porcentaje. El especificador de precisión indica el número deseado de cifras decimales. Si se omite el especificador de precisión, se utiliza la precisión numérica predeterminada especificada en el objeto NumberFormatInfo actual. En el ejemplo siguiente se da formato a valores de punto flotante con el especificador de formato de porcentaje.
|
R o r |
Acción de ida y vuelta |
Este formato sólo es compatible con los tipos Single y Double. El especificador de acción de ida y vuelta garantiza que un valor numérico convertido en cadena volverá a tomar el mismo valor numérico. Cuando se da formato a un valor numérico mediante este especificador, primero se comprueba empleando el formato general, con 15 espacios de precisión para Double y 7 espacios de precisión para Single. Si el valor vuelve a ser efectivamente el mismo valor numérico, se le dará formato utilizando el especificador de formato general. Sin embargo, si el valor no recupera con éxito el mismo valor numérico, se le dará formato empleando 17 dígitos de precisión para Double y 9 dígitos de precisión para Single. Aunque haya un especificador de precisión presente, se omite. Los especificadores de ida y vuelta tienen prioridad sobre la precisión al utilizar este especificador. En el ejemplo siguiente se da formato a valores Double con el especificador de formato de ida y vuelta.
|
X o x |
Hexadecimal |
Este formato sólo es compatible con los tipos enteros. El número se convierte en una cadena de dígitos hexadecimales. La mayúscula o minúscula del especificador de formato indica si hay que emplear los caracteres en mayúsculas o en minúsculas para los dígitos hexadecimales mayores que 9. Por ejemplo, se utiliza 'X' para generar "ABCDEF"y 'x' para generar "abcdef". El especificador de precisión indica el número mínimo de dígitos deseado en la cadena resultante. Si es preciso, el número se rellena con ceros a la izquierda para generar el número de dígitos que aporta el especificador de precisión. En el ejemplo siguiente se da formato a valores Int32 con el especificador de formato hexadecimal.
|
Cualquier otro carácter único |
(Especificador desconocido) |
(Un especificador desconocido provoca una excepción FormatException en tiempo de ejecución). |
Notas
Configuración del Panel de control
Los valores de configuración del elemento Configuración regional y de idioma del Panel de control influyen en la cadena de resultado generada por una operación de formato. Estos valores de configuración se utilizan para inicializar el objeto NumberFormatInfo asociado a la referencia cultural del subproceso actual, y la referencia cultural del subproceso actual proporciona valores que se utilizan para controlar el formato. Los equipos que utilicen una configuración diferente generarán cadenas de resultado diferentes.
Asimismo, si se utiliza el constructor CultureInfo.CultureInfo(String) para crear instancias de un nuevo objeto CultureInfo que representa la misma referencia cultural que la referencia cultural del sistema actual, cualquier personalización establecida por el elemento Configuración regional y de idioma del Panel de control se aplicará al nuevo objeto CultureInfo. Puede utilizar el método CultureInfo.CreateSpecificCulture para crear un objeto CultureInfo que no refleje las personalizaciones de un sistema.
Propiedades NumberFormatInfo
El formato se ve influenciado por las propiedades del objeto NumberFormatInfo actual, proporcionado implícitamente por la referencia cultural del subproceso actual o explícitamente por el parámetro IFormatProvider del método que invoca el formato. Especifique un objeto NumberFormatInfo o CultureInfo para dicho parámetro.
Tipos numéricos enteros y de punto flotante
Algunas descripciones de especificadores de formato numérico estándar hacen referencia a tipos numéricos enteros o de punto flotante. Los tipos numéricos enteros son Byte, SByte, Int16, Int32, Int64, UInt16, UInt32 y UInt64. Los tipos numéricos de punto flotante son Decimal, Single y Double.
Infinitos de punto flotante y NaN
Tenga en cuenta que, independientemente de la cadena de formato, si el valor de un tipo de punto flotante Single o Double es infinito positivo, infinito negativo o NaN (Not a Number, no es un número), la cadena con formato será el valor de la propiedad PositiveInfinitySymbol, NegativeInfinitySymbol o NaNSymbol respectiva especificada por el objeto NumberFormatInfo actualmente aplicable.
Ejemplo
En el siguiente ejemplo de código se da formato a un valor numérico entero y de punto flotante mediante la referencia cultural en-us y todos los especificadores de formato numérico estándar. En este ejemplo de código se utilizan dos tipos numéricos concretos, pero se obtendrían resultados similares con cualquiera de los tipos numéricos base (Byte, SByte, Int16, Int32, Int64, UInt16, UInt32, UInt64, Decimal, Single y Double).
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
using System;
using System.Globalization;
using System.Threading;
public class NumericFormats
{
public static void Main()
{
// 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).ToString("P02", ci)); // Displays "P: 83.95 %"
Console.WriteLine("X: 0x{0}",
integral.ToString("X", ci)); // Displays "X: 0x20CB"
Console.WriteLine();
}
}
Vea también
Conceptos
Cadenas con formato numérico personalizado