En esta clase vamos a aprender a convertir variables de un tipo de dato a otro, por ejemplo, de numérico a texto o viceversa. Para ello, primero tenemos que entender dos conceptos importantes: las conversiones implícitas y explícitas.
Conversiones implícitas
Esto sucede cuando tratas de realizar una conversión que el sistema (el compilador) reconoce como seguro y sabe que no va a producir excepciones de conversión (errores). Por ejemplo, cuando concatenas (unir, juntar) un número a un texto. Por otro lado, si tratas de hacer lo contrario (asignar un valor de texto a una variable numérica), el sistema lo tomará como un error y no te dejará compilar tu programa. Veamos los siguientes ejemplos.
// En este ejemplo no va a haber ningún problema.
// El compilador sabe que un valor numérico no puede provocar una excepción (error).
string value = "hola " + 1;
// En este ejemplo si hay error.
// El compilador no sabe que valor le asignarás a la variable numérica, puede ser un número (como en el ejemplo) o una letra cualquiera.
// Por lo tanto, te pide que hagas una conversión explícita.
int valueTwo = "1":
¿Por qué en el segundo ejemplo existe el error? Como comentamos al inicio, las variables son espacios de memoria que serán llenados posteriormente (en tiempo de ejecución) por el usuario o por tu propio programa. Por lo tanto, el compilador no sabe que valor va a tener, es posible que tenga una «a» y cuando trate de convertirlo implícitamente, se genere una excepción (error), por esa razón, te pide que lo hagas explícitamente, es decir, que programes una función que valide cuando ese valor de texto es verdaderamente un número para que pueda realizar la conversión sin ningún tipo de problema.
¿Cuándo usar una conversión implícita? Generalmente se puede usar una conversión implícita cuando desees convertir un valor de cualquier tipo de dato a texto, ya que es poco probable que se genere un error, porque básicamente todo se puede convertir a texto: un número entero, un número decimal, una fecha, una valor booleano, etc.
¿Es buena práctica realizar conversiones implícitas? No. Es bastante probable que se produzcan errores que no hayas controlado, o que se pierda información (si conviertes un decimal a entero, pierdes los decimales, por ejemplo). Por lo tanto, siempre es bueno realizar conversiones explícitas.
Conversiones explícitas
Una conversión es explícita cuando le indicas al sistema (compilador) que quieres realizar una conversión y usas una de las funciones preprogramadas que C# tiene para ti. Por ejemplo, en ejercicios anteriores hemos usado la función «parse», la cual nos permite convertir un valor de texto a numérico.
Para realizar conversiones explícitas debemos tener en cuenta que tipo de datos vamos a convertir, puede ser de texto a número, de fecha a texto, de enteros a decimales, etc. A continuación vamos a ver las combinaciones más importantes.
Convertir int, double, bool, char a texto
Para convertir cualquier variable a texto, lo único que tenemos que hacer es agregar la función «ToString()» al final de cada variable.
// Para convertir de entero a texto
int valueInt = 10;
string valueIntToString = valueInt.ToString();
// Para convertir de decimal a texto
double valueDouble = 21.14;
string valueDoubleToString = valueDouble.ToString();
// Para convertir de booleano a texto
bool valueBoolean = true;
string valueBooleanToString = valueBoolean.ToString();
// Para convertir de char a texto
char valueChar = 'A';
string valueCharToString = valueChar.ToString();
Convertir DateTime a texto
Para convertir una fecha a texto tenemos varias opciones, ya que podemos especificar en que formato queremos que nos muestre la fecha.
/* Para convertir de fecha a texto */
DateTime valueDateTime = DateTime.Now;
string valueDateTimeToString = valueDateTime.ToString();
Console.WriteLine("Salida: " + valueDateTimeToString);
// Salida: 05/08/2021 13:56:07
string valueDateTimeToShortDateString = valueDateTime.ToShortDateString();
Console.WriteLine("Salida: " + valueDateTimeToShortDateString);
// Salida: 05/08/2021
string valueDateTimeToLongDateString = valueDateTime.ToLongDateString();
Console.WriteLine("Salida: " + valueDateTimeToLongDateString);
// Salida: jueves, 5 de agosto de 2021
string valueDateTimeToShortTimeString = valueDateTime.ToShortTimeString();
Console.WriteLine("Salida: " + valueDateTimeToShortTimeString);
// Salida: 13:56
string valueDataTimeToLongTimeString = valueDateTime.ToLongTimeString();
Console.WriteLine("Salida: " + valueDataTimeToLongTimeString);
// Salida: 13:56:07
/* Aplicando formato */
// Obtenemos el día del mes, rango: 1 a 31
// Agregamos el % delante para no confundir con los formatos standar
string strFormatd = valueDateTime.ToString("%d");
Console.WriteLine("Salida: " + strFormatd);
// Salida: 5
// Obtenemos el día del mes, pero agregando un 0 a los números menores de 10
string strFormatdd = valueDateTime.ToString("dd");
Console.WriteLine("Salida: " + strFormatdd);
// Salida: 05
// Obtenemos el nombre del día de la semana abreviado
string strFormatddd = valueDateTime.ToString("ddd");
Console.WriteLine("Salida: " + strFormatddd);
// Salida: jue.
// Obtenemos el nombre del día de la semana
string strFormatdddd = valueDateTime.ToString("dddd");
Console.WriteLine("Salida: " + strFormatdddd);
// Salida: jueves
// Obtenemos la hora en formato 12 horas
// Agregamos el % delante para no confundir con los formatos standar
string strFormath = valueDateTime.ToString("%h");
Console.WriteLine("Salida: " + strFormath);
// Salida: 1
// Obtenemos la hora en formato 12 horas con un cero delante a los números menores que 10
string strFormathh = valueDateTime.ToString("hh");
Console.WriteLine("Salida: " + strFormathh);
// Salida: 01
// Obtenemos la hora en formato 24 horas
// Agregamos el % delante para no confundir con los formatos standar
string strFormatH = valueDateTime.ToString("%H");
Console.WriteLine("Salida: " + strFormatH);
// Salida: 13
// Obtenemos la hora en formato 24 horas con un cero delante a los números menores que 10
string strFormatHH = valueDateTime.ToString("HH");
Console.WriteLine("Salida: " + strFormatHH);
// Salida: 13
// Obtenemos los minutos, rango: 0 a 59
// Agregamos el % delante para no confundir con los formatos standar
string strFormatm = valueDateTime.ToString("%m");
Console.WriteLine("Salida: " + strFormatm);
// Salida: 1
// Obtenemos los minutos con un cero delante de los números menores que 10
string strFormatmm = valueDateTime.ToString("mm");
Console.WriteLine("Salida: " + strFormatmm);
// Salida: 01
// Obtenemos el mes, rango: 1 a 12
// Agregamos el % delante para no confundir con los formatos standar
string strFormatM = valueDateTime.ToString("%M");
Console.WriteLine("Salida: " + strFormatM);
// Salida: 8
// Obtenemos el mes, con un cero delante de los números menores que 10
string strFormatMM = valueDateTime.ToString("MM");
Console.WriteLine("Salida: " + strFormatMM);
// Salida: 08
// Obtenemos el nombre del mes abreviado
string strFormatMMM = valueDateTime.ToString("MMM");
Console.WriteLine("Salida: " + strFormatMMM);
// Salida: Ago.
// Obtenemos el nombre del mes
string strFormatMMMM = valueDateTime.ToString("MMMM");
Console.WriteLine("Salida: " + strFormatMMMM);
// Salida: Agosto
// Obtenemos los segundos, rango: 0 a 59
// Agregamos el % delante para no confundir con los formatos standar
string strFormats = valueDateTime.ToString("%s");
Console.WriteLine("Salida: " + strFormats);
// Salida: 39
// Obtenemos lo segundos, con un cero delante de los números menores que 10
string strFormatss = valueDateTime.ToString("ss");
Console.WriteLine("Salida: " + strFormatss);
// Salida: 39
// Obtenemos el valor AM/PM de la hora (solo la primera letra)
// Agregamos el % delante para no confundir con los formatos standar
string strFormatt = valueDateTime.ToString("%t");
Console.WriteLine("Salida: " + strFormatt);
// Salida: p
// Obtenemos el valor AM/PM de la hora
string strFormattt = valueDateTime.ToString("tt");
Console.WriteLine("Salida: " + strFormattt);
// Salida: p.m.
// Obtenemos los dos últimos valores del año
// Agregamos el % delante para no confundir con los formatos standar
string strFormaty = valueDateTime.ToString("%y");
Console.WriteLine("Salida: " + strFormaty);
// Salida: 21
// Obtenemos los dos últimos valores del año, agregando un cero delante si es de un dígito
string strFormatyy = valueDateTime.ToString("yy");
Console.WriteLine("Salida: " + strFormatyy);
// Salida: 21
// Obtenemos el año en formato de tres dígitos (sólo si el año es menos que 1000)
string strFormatyyy = valueDateTime.ToString("yyy");
Console.WriteLine("Salida: " + strFormatyyy);
// Salida: 2021
// Obtenemos el año en formato de cuatro dígitos.
string strFormatyyyy = valueDateTime.ToString("yyyy");
Console.WriteLine("Salida: " + strFormatyyyy);
// Salida: 2021
// Obtenemos el año en formato de cinco dígitos.
string strFormatyyyyy = valueDateTime.ToString("yyyyy");
Console.WriteLine("Salida: " + strFormatyyyyy);
// Salida: 02021
Tenemos muchos formatos para aplicar, y lo mejor de todo, es que podemos combinarlos.
DateTime dtDateTimeNow = DateTime.Now;
Console.WriteLine(dtDateTimeNow.ToString("MMMM yyyy"));
// Salida: Agosto 2021
Console.WriteLine(dtDateTimeNow.ToString("dddd dd, MMMM, yyyy"));
// Salida: jueves 05, agosto, 2021
Console.WriteLine(dtDateTimeNow.ToString("hh:mm tt"));
// Salida: 02:16 p.m.
Console.WriteLine(dtDateTimeNow.ToString("HH:mm"));
// Salida: 14:16
¿Podemos mostrar los días de la semana o meses en otro idioma? Por su puesto, C# toma el idioma por defecto de nuestro servidor o de la computadora donde está instalado el programa, pero también podemos cambiarlo manualmente de la siguiente manera.
DateTime dtDateTimeValue = DateTime.Now;
Console.WriteLine(dtDateTimeValue.ToString("dddd", System.Globalization.CultureInfo.CreateSpecificCulture("en-EN")));
// Salida: Thursday
Console.WriteLine(dtDateTimeValue.ToString("MMMM", System.Globalization.CultureInfo.CreateSpecificCulture("en-EN")));
// Salida: August
Podemos especificar el System.Globalization en la parte inicial, luego del «using», para no escribir toda esa parte del código. Si quieres saber más de los idiomas, te recomiendo leer este artículo: https://docs.microsoft.com/en-us/dotnet/api/system.globalization.cultureinfo.getcultures?view=net-5.0
Convertir double, decimal, float a entero
Para convertir de decimal a entero solo tenemos que usar la función de conversión de la clase «int», pero debemos tener en cuenta que perderemos la información de los decimales. Por ejemplo, si convertimos 19.5 a entero, solo obtendremos 19.
double valueDouble = 19.9;
decimal valueDecimal = 13.69590m;
float valueFloat = 19.42344f;
int intCastFromDouble = (int)valueDouble;
int intCastFromDecimal = (int)valueDecimal;
int intCastFromFloat = (int)valueFloat;
Console.WriteLine("Double to Integer: " + intCastFromDouble.ToString());
// Double to Integer: 19
Console.WriteLine("Decimal to Integer: " + intCastFromDecimal.ToString());
// Decimal to Integer: 13
Console.WriteLine("Float to Integer: " + intCastFromFloat.ToString());
// Float to Integer: 19
Si deseas redondear al entero más cercano, lo más recomendable es usar la función Math.Round, recuerda que lo hemos estudiado dos clases atrás.
double valueDouble = 19.9;
int intRound = (int)Math.Round(valueDouble);
Console.WriteLine("Aplicando redondeo: " + intRound.ToString());
// Aplicando redondeo: 20
Convertir texto a entero
Para convertir un texto (string) a entero, tenemos que usar la función «Parse», la cual ya hemos usado muchas veces. Sin embargo, debemos tener en cuenta que se puede producir un excepción (error) si tratamos de convertir un texto que no sea número. Para evitar esos errores, antes de realizar la conversión, se debe hacer una validación, pero ya hablaremos más a fondo de ese tema más adelante, ya que primero debemos aprender a usar el operador «IF».
string strValue = "12";
int intCastStringToInteger = int.Parse(strValue);
Convertir fecha, bool a entero
No es posible, o no tiene mucho sentido, realizar este tipo de conversión.
Convertir entero a decimal
Para convertir de entero a decimal, solo debemos de utilizar la función de conversión de double, decimal o float.
int intValue = 13;
double dblValue = (double)intValue;
decimal decValue = (decimal)intValue;
float fltValue = (float)intValue;
Console.WriteLine("De entero a double: " + dblValue.ToString());
// De entero a double: 13
Console.WriteLine("De entero a decimal: " + decValue.ToString());
// "De entero a decimal: 13
Console.WriteLine("De entero a float: " + fltValue.ToString());
// De entero a float: 13
A simple vista no se ve ningún cambio, ni se agrega el punto decimal, pero realizar esta conversión nos sirve para asegurar de que en nuestros cálculos se consideren los decimales.
Convertir texto a decimal
Para convertir un texto (string) a decimal, tenemos que usar la función «Parse». Sin embargo, debemos tener en cuenta que se puede producir un excepción (error) si tratamos de convertir un texto que no sea número. Para evitar esos errores, antes de realizar la conversión, se debe hacer una validación, pero ya hablaremos más a fondo de ese tema más adelante, ya que primero debemos aprender a usar el operador «IF».
string strValue = "3.14151658216";
double dblCastStringToDouble = double.Parse(strValue);
decimal decCastStringToDecimal = decimal.Parse(strValue);
float fltCastStringToDecimal = float.Parse(strValue);
Console.WriteLine("De texto a double: " + dblCastStringToDouble.ToString());
// De texto a double: 3.14151658216
Console.WriteLine("De texto a decimal: " + decCastStringToDecimal.ToString());
// De texto a decimal: 3.14151658216
Console.WriteLine("De texto a float: " + fltCastStringToDecimal.ToString());
// De texto a float: 3.1415167
Convertir fecha, bool a decimal.
No es posible, o no tiene mucho sentido, realizar este tipo de conversión.
Convertir de texto a fecha
En la clase anterior vimos como usar los métodos TryParse y Parse de la clase DateTime, te recomienda darle una revisada.
Convertir entero, decimal, bool a fecha
No es posible, o no tiene mucho sentido, realizar este tipo de conversión.
Para concluir, podemos afirmar que lo ideal es realizar siempre conversiones explícitas, esto evitará que se generen excepciones no controlados (errores), que podamos realizar validaciones correctamente y que garanticemos que la información no se va a perder. Así que a partir de ahora en adelante, solo usaremos conversiones explícitas.
Espero que el contenido de esta clase te haya servido de mucho, y si aún tienes dudas, o algo no está claro, déjanos tu comentario para tenerlo en cuenta y explayarnos un poco más (o corregir) en caso sea necesario.
Nos sería de mucha ayuda que compartas el contenido si te ha gustado y te invitamos a seguirnos en nuestras redes sociales de Clase13, estamos en Facebook, Instagram y Twitter como @Clase13lat, de esa manera te enterarás de las últimas novedades de manera rápida. También te invito a seguirme en Instagram como @rodolfopenia donde estaré subiendo contenido adicional para complementar la clase.