Cuando estamos trabajando con diferentes tipos de datos, siempre conviene conocer los mecanismos para convertir un tipo de datos en otros. Si a eso le sumamos, que podamos hacer aplicaciones en las que se trabaje introduciendo datos siguiente el formalismo español (comas para separar decimales, puntos para separar miles) o viceversa (podéis ver un mapa de dónde se usa cada separador decimal aquí).
Esto es lo que se llama la información cultural, que se sitúa dentro del ensamblado: System.Globalization, y que aparte de en este tema es conveniente conocer para otras tareas.
Casting
Es la forma más simple de hacer una conversión de datos. Está directamente heredada de C y puede ser implícita (si no se especifica) o explícita (cuando sí lo hacemos). Tiene grandes limitaciones porque básicamente sólo permite no convertir, sino camuflar, para una instrucción en concreto el tipo de dato.
Veamos un ejemplo:
int i = 10; float f = 0; f = i; // conversión implícita f = 0.5F; i = (int)f; // conversión explícita. Existe pérdida de información, los decimales
Métodos ToString
Al igual que en otros muchos lenguajes de programación, a este nivel de abstracción, existe un método ToString, definido en cada clase, que convierte cualquier objeto en una cadena. Si tenemos un entero que tiene dentro el valor 1, devolverá una cadena “1”; igualmente pasará con un decimal, pero aquí es donde entra la información cultural en juego. Si tenemos la cultura predefinida como la española, mostrará comas y punto de acuerdo a nuestra forma de hacerlo, si definimos otra cultura predefinida, el comportamiento cambiará conforme a eso. También podemos cambiar de forma puntual la cultura predefinida para un punto en concreto.
Veamos ejemplos de uso avanzado de ToString usando especificadores, para mostrar el mismo número por pantalla con decimales, sin ellos, en formato moneda, con porcentaje…
decimal valor = 16325.62m; string especificador; // Sin especificador Console.WriteLine("Sin el especificador tenemos el valor: " + valor.ToString()); // Especificador numérico estándar especificador = "G"; Console.WriteLine("Con el especificador: " + especificador + " tenemos el valor: " + valor.ToString(especificador)); // Muestra: 16325,62 especificador = "C"; Console.WriteLine("Con el especificador: " + especificador + " tenemos el valor: " + valor.ToString(especificador)); // Muestra: 16.325,62€ especificador = "E04"; Console.WriteLine("Con el especificador: " + especificador + " tenemos el valor: " + valor.ToString(especificador)); // Muestra: 1,6326E+004 especificador = "F"; Console.WriteLine("Con el especificador: " + especificador + " tenemos el valor: " + valor.ToString(especificador)); // Muestra: 16325,62 especificador = "N"; Console.WriteLine("Con el especificador: " + especificador + " tenemos el valor: " + valor.ToString(especificador)); // Muestra: 16.325,62 especificador = "P"; Console.WriteLine("Con el especificador: " + especificador + " tenemos el valor: " + valor.ToString(especificador)); // Muestra: 1.632.562,00%
Veamos un ejemplo de uso con información cultural (CultureInfo):
System.Globalization.CultureInfo culture = new System.Globalization.CultureInfo("EN-us"); Console.WriteLine("Cambiando a cultura de inglés de Estados Unidos tenemos: " + valor.ToString(culture.NumberFormat)); // Muestra: 16325.62
Existen objetos, que a pesar de tener un método de este tipo, la cadena que devuelven no contiene prácticamente nada de la información del objeto. Por ejemplo, si tenemos un DataTable y le invocamos el método ToString, probablemente la salida sea sólo que es una instancia del tipo de objeto DataTable.
Métodos Parse
Podríamos decir que las funciones Parse, son la funciones inversas a los métodos ToString. A diferencia de los primeros, de una cadena, son capaces de leer su contenido y plasmarlo en un tipo de dato concreto, por ejemplo, de cadena a entero.
En C existían unas cuantas funciones que hacían esa misma labor: atoi, atol…. Además de ser verdaderamente útiles en interfaces gráficos y web, recordad que los datos que introducen los usuarios suelen venir en formato cadena, por la propia constitución de este tipo de interfaces.
Además son verdaderamente útiles cuando tratamos con tipos de datos a los que no podemos hacer casting directamente, ya que la solución más práctica es hacer un ToString seguido de un Parse.
Veamos ejemplos:
string valor = "1"; int a = int.Parse(a); Console.WriteLine("El valor de a es: " a.ToString());
Como podréis imaginar, si queremos pasar datos decimales con comas y puntos de tal manera o de tal otra, también deberemos usar en este punto la información cultural.
Nos vemos en la próxima entrega.
Entregas anteriores
https://www.youtube.com/embed/z-xGk9c_eOw Guionista y locutor: Manuel Ignacio López Quintero.Fecha de publicación: 31 de diciembre de 2024.
Ver comentarios
muy bueno! gracias!
int a = int.Parse(valor); ¿no?
gracias
Exacto, como en Java, pero en lugar de usar Integer usas int, de hecho es mucho más cómodo en C#, no tienes int e Integer.