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() redefinido, hasta el uso de ICustomFormatter (que no se cubre en este ejercicio).

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

Uso de ToString()

System.Object(), del que heredan todas las clases y structs, tiene un método ToString(). Por ejemplo, new DateTime(2019, 5, 23).ToString() muestra «05/23/2019 00:00:00» (en un hilo con la cultura de EE. UU.; ver más abajo). Hay situaciones, como la concatenación de strings, en las que este método ToString() predeterminado puede invocarse 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 (Base Class Library), en particular, estos son los números, las fechas, los enums y los GUID.

Formato compuesto

String.Format() toma un string (al que la documentación llama formato compuesto) que consta de texto fijo y marcadores de posición (a los que la documentación llama elementos de formato) y un número variable de argumentos. El valor devuelto resuelve cada elemento de formato con 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 una 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, por ejemplo cuando hay [cadenas textuales][verbatim-strings] de por medio.

Este mecanismo se conoce técnicamente como formato compuesto.

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

Interpolación de strings

Los strings interpolados llevan el prefijo $ 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 separada de argumentos. El resultado es funcionalmente equivalente al mecanismo de String.Format().

La expresión puede contener cualquier cosa que esté en el ámbito. La alineación es la longitud del «campo» en el que se ubica el texto. Si la alineación es positiva, el texto se rellena con espacios a la izquierda; 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 entre llaves, que son marcadores de posición en el caso del formato compuesto y 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 obligatoria o el marcador de posición del argumento, como se ve en el código de ejemplo de arriba. Además, hay una alineación opcional (introducida con una coma, «,») y un string de formato opcional (introducido 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 miles en un número o si solo se debe mostrar la parte de la fecha de un objeto DateTime.

El siguiente código muestra la parte de la fecha de un objeto DateTime y un número de punto 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

Hay formato tanto estándar como personalizado para números y 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. El término «personalizado» en este contexto no tiene nada que ver con la interfaz ICustomFormatter, que se usa cuando desarrollas tus propios formateadores.

Formateadores y strings de formato de la BCL

La Base Class Library (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 eso haga algo.

En la biblioteca se hace un intento de aportar cierta consistencia a los strings de formato (más allá de que se representen como strings). Ese esfuerzo por la consistencia se encuentra en los strings estándar. En realidad, como desarrollador rara vez te importa la diferencia entre strings estándar y personalizados. Si bien es buena idea que, al implementar formateadores para tus propias clases, imites los strings estándar existentes cuando tus clases parezcan necesitarlo, en la práctica puedes ignorar la diferencia.

Cultura

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

CultureInfo implementa la interfaz IFormatProvider, que se puede pasar a ciertas sobrecargas de String.Format(). Esto se puede usar para sobrescribir la cultura del hilo.

Material de referencia

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

Aprende Formato de strings

La práctica está bloqueada

Desbloquea 11 ejercicios más para practicar Formato de strings