csharp-formato-strings

Cómo aplicar formato a strings en C#

  • 4 min

Formatear un string consiste en construir una cadena a partir de texto y valores con una representación determinada.

En C# tenemos varias formas de hacerlo, desde la concatenación hasta la interpolación o String.Format. La elección depende sobre todo de la legibilidad que necesitamos y del tipo de formato que queremos aplicar.

Concatenar cadenas

La forma más directa es concatenar varias cadenas con el operador +:

string nombre = "Juan";
int edad = 25;
string mensaje = "Hola, mi nombre es " + nombre + " y tengo " + edad + " años.";

Console.WriteLine(mensaje);
Copied!
Hola, mi nombre es Juan y tengo 25 años.
Copied!

Este enfoque funciona bien en casos sencillos, aunque pierde legibilidad cuando intervienen muchos valores o necesitamos aplicar formatos distintos.

Usar String.Format

String.Format inserta valores en una cadena mediante marcadores de posición numerados:

string resultado = string.Format("Texto con valor: {0}", valor);
Copied!

El número de {0} es un índice de formato. Se sustituye por el argumento que ocupa esa posición después de la cadena de formato.

string nombre = "Ana";
int edad = 30;
string mensaje = string.Format(
    "Hola, mi nombre es {0} y tengo {1} años.",
    nombre,
    edad);

Console.WriteLine(mensaje);
Copied!
Hola, mi nombre es Ana y tengo 30 años.
Copied!

También podemos añadir un especificador después de dos puntos. Por ejemplo, F2 muestra un número de punto flotante con dos decimales:

double precio = 15.6789;
string mensaje = string.Format("El precio es: {0:F2}", precio);

Console.WriteLine(mensaje);
Copied!
El precio es: 15.68
Copied!

Interpolación de cadenas

La interpolación de cadenas permite insertar variables o expresiones directamente entre llaves. Para ello, añadimos $ antes de la cadena:

string nombre = "Pedro";
int edad = 40;
string mensaje = $"Hola, mi nombre es {nombre} y tengo {edad} años.";

Console.WriteLine(mensaje);
Copied!

La interpolación suele ser más legible que los índices de String.Format, especialmente cuando aparecen varios valores.

Los mismos especificadores funcionan dentro de una cadena interpolada:

double precio = 12.3498;
string mensaje = $"El precio es: {precio:F2}";

Console.WriteLine(mensaje);
Copied!
El precio es: 12.35
Copied!

Aplicar formato con ToString()

Los tipos que admiten formato ofrecen sobrecargas de ToString() con las que podemos controlar su representación. Es habitual usarlas con números, fechas y horas.

DateTime fecha = new DateTime(2025, 12, 12, 15, 30, 45);
string texto = fecha.ToString("yyyy-MM-dd HH:mm:ss");

Console.WriteLine(texto);
Copied!
2025-12-12 15:30:45
Copied!

Ten en cuenta que algunos especificadores dependen de la cultura actual. Si el formato debe ser estable para intercambio de datos, indica explícitamente la cultura apropiada.

Unir varios valores

String.Concat concatena varios valores sin separador. Es equivalente a encadenar el operador + en muchos casos:

string mensaje = string.Concat("Nombre: ", nombre, ", edad: ", edad);
Copied!

Por su parte, String.Join inserta un separador entre los elementos de una colección:

string[] nombres = { "Juan", "Ana", "Pedro", "María" };
string mensaje = string.Join(", ", nombres);

Console.WriteLine(mensaje);
Copied!
Juan, Ana, Pedro, María
Copied!

Construir cadenas con StringBuilder

Cuando modificamos una cadena muchas veces, por ejemplo dentro de un bucle, StringBuilder evita crear un string intermedio en cada operación.

using System.Text;

StringBuilder sb = new StringBuilder();

for (int i = 1; i <= 5; i++)
{
    sb.AppendLine($"Número {i}");
}

string resultado = sb.ToString();
Copied!

Esto puede ser más eficiente en construcciones grandes o repetitivas. Para unas pocas concatenaciones, normalmente prima la claridad y no hace falta introducir StringBuilder.

Especificadores numéricos habituales

Los especificadores estándar cubren los formatos más frecuentes:

EspecificadorUsoEjemplo
CMoneda{precio:C2}
DEntero decimal con ceros{numero:D4}
FPunto fijo{valor:F2}
NNúmero con separadores{valor:N2}
PPorcentaje{proporcion:P1}
XHexadecimal{numero:X}

El número que sigue a la letra suele indicar la precisión. Por ejemplo, F2 muestra dos decimales y D4 completa un entero con ceros hasta alcanzar cuatro dígitos.

Alinear valores

Dentro de un marcador puedes indicar un ancho mínimo después de una coma. Un valor positivo alinea a la derecha y uno negativo, a la izquierda:

string nombre = "Juan";
int edad = 25;

string mensaje = string.Format(
    "Nombre: {0,-10} Edad: {1,5}",
    nombre,
    edad);

Console.WriteLine(mensaje);
Copied!

La alineación resulta útil para generar columnas de texto, registros o salidas de consola sin construir manualmente los espacios.