En C#, el formateo de salida se logra a través de Console.WriteLine, string.Format y la interpolación de strings ($\"...\"). A diferencia de C, los especificadores de formato no dependen del tipo, sino que usan marcadores de posición con cadenas de formato.
Sintaxis Básica del Formateo
Uso de Marcadores de Posición
Console.WriteLine("{0} y {1}", 123, 3.14);
// Salida: 123 y 3.14
Los marcadores {0} y {1} representan los argumentos por orden de índice. C# invoca automáticamente el método ToString() de cada parámetro.
Marcadores con Formato Específico
Formato general: {índice[,alineación][:cadenaFormato]}
índice: Posición del argumento (obligatorio).alineación: Ancho deseado (positivo para derecha, negativo para izquierda).cadenaFormato: Define el estilo de visualización (ej.N2para dos decimales,Xpara hexadecimal).
int dato = 123;
double valorPi = 3.14159;
Console.WriteLine("{0:D}", dato); // Decimal: 123
Console.WriteLine("{0,5}", dato); // Ancho 5, derecha: " 123"
Console.WriteLine("{0,-5}", dato); // Ancho 5, izquierda: "123 "
Console.WriteLine("{0:F2}", valorPi); // Dos decimales: 3.14
Console.WriteLine("{0:P}", 0.75); // Porcentaje: 75.00%
Cadenas de Formato Numérico Estándar
| Formato | Descripción | Ejemplo (numero = 5678.9123) |
Salida |
|---|---|---|---|
D o d |
Entero decimal | {0:D} |
5678 |
N o n |
Número con separadores de miles | {0:N1} |
5,678.9 |
F o f |
Decimal fijo | {0:F3} |
5678.912 |
E o e |
Notación científica | {0:E1} |
5.7E+003 |
C o c |
Moneda | {0:C} |
$5,678.91 |
P o p |
Porcentaje | {0:P2} |
567891.23% |
X o x |
Hexadecimal (solo enteros) | {0:X} |
162E |
Nota: D y X son exclusivos parra tipos enteros; los decimales usan F, E, etc.
Salida en Binario, Octal y Hexadecimal
Hexadecimal Integrado
int cantidad = 200;
Console.WriteLine("{0:X}", cantidad); // Salida: C8 (mayúsculas)
Console.WriteLine("{0:x}", cantidad); // Salida: c8 (minúsculas)
Console.WriteLine("{0:X4}", cantidad); // Salida: 00C8 (ancho 4, relleno con ceros)
Octal mediante Conversión
Usar Convert.ToString(valor, 8):
int cantidad = 42;
string octal = Convert.ToString(cantidad, 8);
Console.WriteLine(octal); // Salida: 52
// Alineación manual si se requiere
Console.WriteLine("{0,5}", octal); // " 52"
Binario mediante Conversión
Usar Convert.ToString(valor, 2):
int cantidad = 42;
string binario = Convert.ToString(cantidad, 2);
Console.WriteLine(binario); // Salida: 101010
// Ancho fijo (ej. 8 bits) con PadLeft
Console.WriteLine(binario.PadLeft(8, '0')); // Salida: 00101010
Uso en Interpolación de Strings
int numero = 255;
Console.WriteLine($"Hexadecimal: {numero:X}"); // FF
Console.WriteLine($"Binario: {Convert.ToString(numero, 2)}"); // 11111111
Ejemplo Completo
using System;
class Programa
{
static void Main()
{
int decimalVal = 42;
double piVal = 3.14159;
char caract = 'A';
string texto = "Hola";
Console.WriteLine("Decimal: {0}", decimalVal);
Console.WriteLine("Ancho 5 derecha: {0,5}", decimalVal);
Console.WriteLine("Ancho 5 izquierda: {0,-5}", decimalVal);
Console.WriteLine("Relleno ceros: {0:D5}", decimalVal);
Console.WriteLine("Decimal (por defecto): {0}", piVal);
Console.WriteLine("Dos decimales: {0:F2}", piVal);
Console.WriteLine("Ancho 8, dos decimales: {0,8:F2}", piVal);
Console.WriteLine("Hexadecimal minúsculas: {0:x}", decimalVal);
Console.WriteLine("Hexadecimal mayúsculas: {0:X}", decimalVal);
Console.WriteLine("Octal: {0}", Convert.ToString(decimalVal, 8));
Console.WriteLine("Binario: {0}", Convert.ToString(decimalVal, 2));
Console.WriteLine("Carácter: {0}", caract);
Console.WriteLine("Texto: {0}", texto);
}
}
Salida esperada:
Decimal: 42
Ancho 5 derecha: 42
Ancho 5 izquierda: 42
Relleno ceros: 00042
Decimal (por defecto): 3.14159
Dos decimales: 3.14
Ancho 8, dos decimales: 3.14
Hexadecimal minúsculas: 2a
Hexadecimal mayúsculas: 2A
Octal: 52
Binario: 101010
Carácter: A
Texto: Hola
Comparación con printf de C
| Formato printf en C | Salida | Equivalente en C# |
|---|---|---|
%d |
42 |
{0} o {0:D} |
%5d |
" 42" |
{0,5} |
%-5d |
"42 " |
{0,-5} |
%05d |
"00042" |
{0:D5} |
%.2f |
3.14 |
{0:F2} |
%8.2f |
" 3.14" |
{0,8:F2} |
%x |
"2a" |
{0:x} |
%X |
"2A" |
{0:X} |
%o |
"52" |
Convert.ToString(42, 8) |
| Binario (no estándar) | "101010" |
Convert.ToString(42, 2) |
Técnica Avanzada: Personalización para Binario/Octal
Se puede crear un método de extensión para simplificar la salida en binario:
// Método de extensión en una clase estática
public static string ABinario(this int valor, int digitosMinimos = 0)
{
string bin = Convert.ToString(valor, 2);
return digitosMinimos > 0 ? bin.PadLeft(digitosMinimos, '0') : bin;
}
// Uso
int x = 42;
Console.WriteLine(x.ABinario()); // 101010
Console.WriteLine(x.ABinario(8)); // 00101010
En proyectos simples, usar Convert.ToString es suficiente para estos formatos.