csharp-conversiones-numericas-casting

Conversiones numéricas y Casting en C#

  • 6 min

C# es un lenguaje estáticamente tipado. Esto significa que, si declaras una variable como int, el compilador no te dejará meterle un string o un bool “porque sí”.

Sin embargo, a veces necesitamos mover datos de un tipo a otro. Tal vez tienes un int y necesitas usarlo en una operación matemática que requiere double. O tienes un double y necesitas guardarlo en un campo que solo acepta int.

Aquí entran en juego las conversiones numéricas. C# ofrece dos tipos principales de conversiones numéricas:

  1. Conversiones implícitas: Estas conversiones no requieren una notación especial y son seguras, ya que no provocan pérdida de datos.
  2. Conversiones explícitas (casting): Estas conversiones requieren el uso de un operador de conversión y pueden llevar a pérdida de datos si no se manejan con cuidado.

Conversiones implícitas (Widening)

Las conversiones implícitas son aquellas que el compilador de C# realiza automáticamente. No necesitas escribir ningún código especial.

¿Por qué ocurren? Porque son conversiones seguras.

La regla general es la del “Ensanchamiento” (Widening): Si intentas guardar un valor pequeño en un contenedor grande, no hay riesgo de que se derrame nada. No hay pérdida de información.

int numeroPequeno = 1234;
long numeroGrande = numeroPequeno; // Conversión Implícita: OK

float altura = 1.75f;
double alturaPrecisa = altura;     // Conversión Implícita: OK

Copied!

En estos casos:

  1. Un int (32 bits) cabe perfectamente en un long (64 bits).
  2. Un float (menor precisión) cabe en un double (mayor precisión).

Conversiones explícitas (Casting)

Las conversiones explícitas son aquellas donde nosotros forzamos al compilador a realizar la conversión, aunque exista riesgo. Esto se conoce comúnmente como Casting.

Esto ocurre en operaciones de “Estrechamiento” (Narrowing): intentar meter un valor de un contenedor grande en uno pequeño.

Para realizar un cast, colocamos el tipo de destino entre paréntesis (tipo) delante de la variable.

double precioExacto = 99.99;
int precioEntero = (int)precioExacto; // Casting Explícito

Console.WriteLine(precioEntero); // Imprime: 99

Copied!

Al hacer casting de un decimal (double, float, decimal) a un entero, C# TRUNCA el número. No redondea al más cercano. Simplemente elimina todo lo que haya después de la coma.

Tabla de conversiones numéricas

Para tenerlo claro visualmente, aquí tenéis una tabla simplificada de qué conversiones son implícitas. Si no está en la lista, asumid que necesitáis un Cast explícito.

DesdeSe convierte implícitamente a
sbyteshort, int, long, float, double, decimal
byteshort, ushort, int, uint, long, ulong, float, double, decimal
shortint, long, float, double, decimal
intlong, float, double, decimal
longfloat, double, decimal
floatdouble

Fijaos que no existen conversiones implícitas hacia char, byte o short desde otros tipos numéricos (salvo literales constantes pequeños). Siempre requieren casting.

Conversión usando métodos de la clase Convert

C# incluye la clase Convert, que proporciona métodos estáticos para realizar conversiones entre tipos de datos.

double valorDouble = 150.75;
int valorInt = Convert.ToInt32(valorDouble); // Redondea automáticamente el valor
Copied!

El método Convert.ToInt32() redondea el valor de valorDouble en lugar de truncarlo, lo cual puede ser útil en aplicaciones donde se requiere precisión.

Algunos métodos de conversión comunes incluyen:

  • Convert.ToDouble()
  • Convert.ToInt32()
  • Convert.ToDecimal()

Convert realiza un redondeo, y además maneja los valores null devolviendo 0 (en lugar de explotar), lo cual es muy útil cuando trabajamos con datos que vienen de bases de datos o formularios web.

Conversión numéricas de cadenas de texto

Para muchas aplicaciones, necesitamos convertir valores numéricos a texto para mostrarlos en una interfaz de usuario, o convertir texto a valores numéricos a partir de una entrada del usuario.

En C#, esto se hace principalmente con los métodos ToString(), Parse() y TryParse().

Convertir de número a cadena

El método ToString() convierte un número a una cadena. Podemos especificar formatos para representar el número según nuestras necesidades:

double valorDouble = 12345.6789;
string texto = valorDouble.ToString("F2"); // Convierte a "12345.68" con dos decimales
Copied!

Convertir de cadena a número

Para convertir una cadena de texto a un número, usamos Parse() o TryParse():

Convierte una cadena a un tipo numérico, pero lanza una excepción si la conversión falla.

string texto = "123.45";
double valorDouble = double.Parse(texto);
Copied!

Similar a Parse, pero en lugar de lanzar una excepción, devuelve false si la conversión no es posible, evitando errores en tiempo de ejecución.

string texto = "123.45";
if (double.TryParse(texto, out double valorDouble))
{
    Console.WriteLine($"Conversión exitosa: {valorDouble}");
}
else
{
    Console.WriteLine("Error en la conversión");
}
Copied!

TryParse es preferible cuando la entrada puede no ser numérica, ya que permite un control de errores más seguro.

Ejemplo prácticos