Tracks
/
C#
C#
/
Temario
/
Formato de strings
Fo

Formato de strings en C#

13 ejercicios

Acerca de Formato de strings

Los mecanismos para formatear strings en C#/.NET son muchos y muy variados: desde la simple concatenación de objetos, pasando por llamadas al método object.ToString() sobrescrito, hasta el uso de ICustomFormatter (que no se trata en este ejercicio).

Los dos mecanismos más habituales para formatear strings son la interpolación de strings y String.Format(). La clase StringBuilder (referencia cruzada pendiente) también se puede usar para construir un string cuando hay cierta complejidad, como cuando intervienen varias líneas.

Uso de ToString()

System.Object(), del que heredan todas las clases y estructuras, tiene un método ToString(). Por ejemplo, new DateTime(2019, 5, 23).ToString() mostrará «05/23/2019 00:00:00» (en un hilo con referencia cultural de EE. UU.; consulta más abajo). Hay situaciones, como la concatenación de strings, en las que este método ToString() predeterminado se puede invocar de forma implícita: "" + new DateTime(2019, 5, 23) da el mismo resultado.

Además del método ToString() predeterminado, los tipos en los que el formato es relevante tienen sobrecargas que aceptan un string de formato o incluso un proveedor de formato. En la BCL (Biblioteca de clases base), en concreto, estos son los números, las fechas, las enumeraciones y los GUID.

Formato compuesto

String.Format() recibe un string (denominado en la documentación formato compuesto) que consta de texto fijo y marcadores de posición (conocidos en la documentación como elementos de formato) y un número variable de argumentos. El valor devuelto resuelve cada elemento de formato usando el argumento correspondiente y combina los valores resueltos con el texto fijo.

string.Format("I had {0} bitcoins on {1}, the day I forgot my password.", 55.5, new DateTime(2010, 2, 25))
// => "I had 55.5 bitcoins on 2/25/2010 00:00:00, the day I forgot my password." - US settings

Format() puede ser mejor opción que la interpolación cuando el formato se usa en varias expresiones a modo de plantilla, o cuando incorporar el formato y las expresiones que se van a formatear resulta demasiado engorroso, como sucede con los strings textuales.

Este mecanismo se conoce técnicamente como formato compuesto.

En este artículo se ofrece una lista más completa de los métodos que generan strings y que aprovechan el formato compuesto.

Interpolación de strings

Los strings interpolados van precedidos de un $ e incluyen expresiones que se evalúan en tiempo de ejecución encerradas entre llaves. El elemento de formato tiene la siguiente sintaxis: $"{<interpolationExpression>[,<alignment>][:<formatString>]}". Eliminan la necesidad de una lista de argumentos aparte. El resultado es funcionalmente equivalente al del mecanismo String.Format().

La expresión puede incluir cualquier cosa que esté dentro del scope. La alineación es la longitud del «campo» en el que se sitúa el texto. Si la alineación es positiva, el texto se rellena con espacios a la izquierda, y si es negativa, el relleno va a la derecha del texto.

var loadsOf = 55.5;
var thatDay = new DateTime(2010, 2, 25);
$"I had {loadsOf} bitcoins on {thatDay}, the day I forgot my password."
// => "I had 55.5 bitcoins on 2/25/2010 00:00:00, the day I forgot my password." - US settings

Elementos de formato

El texto que va entre llaves, ya sean marcadores de posición en el caso del formato compuesto o expresiones interpoladas en el caso de la interpolación de strings, se conoce como elemento de formato.

Un elemento de formato puede constar de hasta 3 partes. La primera es la expresión o el marcador de posición de argumento obligatorio, como se ve en el código de ejemplo anterior. Además, hay una alineación opcional (que se introduce con una coma, «,») y un string de formato opcional (que se introduce con dos puntos, «:»).

{<interpolationExpression>[,<alignment>][:<formatString>]}

La alineación especifica la longitud del «campo» en el que se coloca el texto, rellenado con espacios a la izquierda si la alineación es positiva o a la derecha si es negativa.

El string de formato especifica la forma del texto de salida, por ejemplo si se deben incluir separadores de millares en un número o si solo se debe mostrar la parte de la fecha de un objeto DateTime.

El siguiente código ilustra cómo mostrar la parte de la fecha de un objeto DateTime y un número de coma flotante en forma exponencial.

var loadsOf = 55.5;
var thatDay = new DateTime(2010, 2, 25);
$"I had {loadsOf:E} bitcoins on {thatDay:d}, the day I forgot my password."
// => I had 5.550000E+001 bitcoins on 02/25/2010, the day I forgot my password. - US settings

string.Format(
    "I had {0:E} bitcoins on {1:d}, the day I forgot my password.",
    loadsOf, thatDay)
// => I had 5.550000E+001 bitcoins on 02/25/2010, the day I forgot my password. - US settings

Existe formato estándar y personalizado tanto para números como para fechas. No hay una diferencia esencial entre el formato personalizado y el estándar, salvo que tienes la oportunidad de componer strings de formato personalizados a partir de caracteres de formato. «Personalizado», en este contexto, no tiene nada que ver con la interfaz ICustomFormatter, que se usa cuando desarrollas tus propios formateadores personalizados.

Formateadores de la BCL y strings de formato

La Biblioteca de clases base (BCL) proporciona 2 formateadores, DateTimeFormatInfo y NumberFormatInfo, y 6 grupos de strings de formato.

Las distintas listas de strings de formato son las siguientes:

Los strings de formato de Enum y GUID se pueden clasificar como estándar. Aunque enum y GUID tienen sobrecargas de ToString() que aceptan un IFormatProvider, no está claro que hagan algo.

En la biblioteca se intenta imprimir cierta coherencia a los strings de formato (más allá de que se representen como strings). Ese empeño por la coherencia se encuentra en los strings estándar. En realidad, como desarrollador, rara vez te importa la diferencia entre strings estándar y personalizados. Aunque, si implementas formateadores para tus propias clases, es buena idea imitar los strings estándar existentes cuando tus clases parezcan pedirlo, puedes ignorar esa diferencia sin problemas.

Referencia cultural

Cada hilo de ejecución tiene una referencia cultural predeterminada, Thread.CurrentThread.CurrentCulture, encapsulada en una instancia de CultureInfo. La referencia cultural del hilo determina cómo se formatean por defecto las fechas y los números en función de las variaciones regionales, como la diferencia en el formato de fecha convencional entre el Reino Unido (DD/MM/YYYY) y EE. UU. (MM/DD/YYYY).

CultureInfo implementa la interfaz IFormatProvider, que se puede pasar a determinadas sobrecargas de String.Format(). Esto permite anular la referencia cultural del hilo.

Material de referencia

Editar en GitHub El enlace se abre en una nueva ventana o pestaña

Aprende Formato de strings

La práctica está bloqueada

Desbloquea 11 ejercicios más para practicar Formato de strings