viernes, 15 de julio de 2016

Formato y Parseo en C# - Parte 1/2: Introducción

Índice

1. Introducción
2. Palabras Clave
3. Formato y Parseo
4. ToString y Parse
5. Proveedores de Formato
5.1 Interfaz IFormattable
5.2 Formato con ToString
6. Conclusiones
7. Literatura & Enlaces

1. Introducción

Este artículo C# instruye al programador acerca de los procesos de formateo y parseo de cadenas de caracteres. Se muestra cómo estas operaciones permiten manipular o convertir texto a representaciones de interés para un dominio particular. Esto conlleva a tratar elementos de programa de Framework Class Library tales como métodos -ToString y Parse- y clases -proveedores de formato.

2. Palabras Clave

  • Formato
  • Framework Class Library (FCL)
  • Interfaz gráfica de usuario
  • Parseo
  • Proveedor de formato

3. Formato y Parseo

.NET Framework cuenta con elementos de programa diseñados para formatear y parsear cadenas de texto, es decir objetos de la clase string.

Formatear en este contexto significa convertir a una representación de cadena de texto. Mientras que parseo es el proceso inverso: conversión a partir de una cadena de texto. Estas son operaciones comunes en la manipulación de información de entrada y salida en la implementación de algoritmos. Microsoft .NET Framework posee los mecanismos para llevar a cabo estas manipulaciones de datos a través de elementos programas minuciosamente diseñados, que permiten al programador completar sus tareas de formato y parseo de forma efectiva.

Referente a los mecanismos, estos son los 4 que provee .NET (Albahari, 2012)
  • ToString y Parse: Estos métodos están disponibles para gran parte de tipos de datos definidos en FCL.
  • Proveedores de formato: A través de este mecanismo el programador puede especificar una cadena de formato o un proveedor de formato. Estos proveedores de formato son eficaces y flexibles en cuanto al manejo de representaciones de datos en diferentes culturas. Se pueden encontrar diferentes proveedores de formato tanto para fechas y tipos numéricos.
  • XmlConvert: Este elemento de programa es una clase static para formatear y parsear contenido XML.
  • Convertidores de tipos: Mecanismo apto para parseadores de XAML.

4. ToString y Parse

La clase Object cuenta con el miembro ToString ("Object.ToString Method", 2016); este método forma parte de todos los tipos de .NET, y constituye el mecanismo de formateo más básico gracias a la unificación de tipos (Tipos de Datos Básicos en C#).

ToString representa una salida significativa para diferentes tipos de datos; tales como: bool, DateTime, DateTimeOffset, Guid; además de tipos numéricos integrales. Por ejemplo el valor constante true puede ser presentando en cadena de caracteres de esta manera: 

string s = true.ToString();

El valor de s después de la invocación de ToString es "true" -una cadena de caracteres-.

La operación contraria se lleva a cabo a través del método static Parse; así: 

bool b = bool.Parse(s);

La variable b contendrá el valor booleano true.

Si el programador escribe algo como 

bool c = bool.Parse("verdadero");

en tiempo de ejecución la excepción FormatException ("FormatException Class", 2016) será generada debido a "verdadero" no es un valor válido.

TryParse es un método alternativo a Parse: con TryParse si la conversión falla el valor de retorno es false; en caso contrario true. (Más acerca de este método en la sección 1 en Excepciones en C#: Uso de Excepciones.) Un ejemplo práctico de uso de este método podría ser 

int i;
bool fallido = int.TryParse("xyz", out i);
bool satisfactorio = int.TryParse("15", out i);

La conversión con estos dos métodos -Parse y TryParse- sigue la configuración de cultura local. Para cambiar este comportamiento, el programador puede especificar un objeto CultureInfo con la configuración de la nueva cultura (Albahari, 2012). Suponiendo que se quiere parsear la cadena "1.234" en un valor de tipo punto flotante, la siguiente expresión produce 1234 en Alemania: 

Console.WriteLine(double.Parse("1.234")); // 1234 (Alemania)

Esto se debe a que en Alemania el carácter punto (.) se usa para indicar un separador de miles en lugar de punto decimal. Para cambiar este comportamiento, el método sobrecargado Parse recibe como argumento, además de un objeto string, un valor de tipo IFormatProvider

double x = double.Parse("1.234", System.Globalization.CultureInfo.InvariantCulture);

o con ToString 

string x = 1.234.ToString (System.Globalization.CultureInfo.InvariantCulture);

5. Proveedores de Formato

Un proveedor de formato permite al programador C# especificar a un nivel de detalle superior sobre cómo se debe formatear o parsear un valor para su representación. Estos proveedores de formato soportan tanto valores numéricos como fechas y horas. De igual modo, en controles de interfaz gráfica de usuario un proveedor de formato enriquece los mecanismos de entrada y salida de datos.

5.1 Interfaz IFormattable

La interfaz IFormattable ("IFormattable Interface", 2016) cuenta con miembros abstractos para implementar la funcionalidad de formato de valores de datos de un objeto a una representación literal (i.e., cadena de caracteres).

El método ToString tiene esta firma: 

public interface IFormattable
{
string ToString(string format, IFormatProvider formatProvider)
}

En la firma de ToString el primer argumento es la cadena de formato, el segundo es el proveedor de formato. La cadena de formato provee las instrucciones de formato, mientras que el proveedor de formato determina cómo las instrucciones son traducidas.

El programador debe comprender su uso. Aquí se presenta un ejemplo que formatea valores de temperatura en unidades de Fahrenheit (F), Celcius (G y C) y Kelvin (K).
En las líneas 49-74 se implementa el método ToString(string, IFormatProvider) sobre el que se realizan las siguientes acciones: 
  • Líneas 51-54: Comprobación de si la longitud y existencia de formato.
  • Líneas 56-59: Si IFormatProvider es null se asigna la cultura actual.
  • Líneas 61-73: Bloque switch para comprobar la cadena de formato.
Esta es la clase worker para pruebas de la clase Temperatura


Una vez ejecutado este código este es el resultado que se obtiene en la salida estándar: 
Ejecución assembly TemperaturaWorker.exe
Figura 1. Ejecución assembly TemperaturaWorker.exe.

5.2 Formato con ToString

En la sección anterior se ilustró cómo usar el método ToString para formatear la cadena del valor de una temperatura. Este método acepta como segundo argumento un proveedor; en caso de que se especifique null, el proveedor predeterminado es usado -CultureInfo.CurrentCulture.

Console.WriteLine (10.3.ToString("C", null)); // $10.30


Esta expresión también pudo haber quedado así: 

Console.WriteLine (10.3.ToString("C")); // $10.30
Console.WriteLine (10.3.ToString("F4")); // 10.3000


La invocación de ToString sin argumentos con una cadena de formato vacía en una instancia de DateTime o un tipo de dato numérico es equivalente a la especificación del proveedor de formato predeterminado (como en el ejemplo anterior).


Más adelante se estudia con más detalle tres proveedores de formato disponibles en .NET Framework
  • NumberformatInfo
  • DateTimeInfo
  • CultureInfo.

6. Conclusiones

Hasta ahora se ha estudiado el mecanismo básico de formato y parseo de valores literales. Se ha demostrado a través de un ejemplo como crear una implementación concreta de la interfaz IFormattable a través de una clase que representa temperaturas en Celsius, Kelvin y Fahrenheit.

En la segunda parte de esta serie se hace mayor énfasis en el proveedores de formato, formato compuesto, parseo con proveedores de formato, y las clases IFormatProvider y ICustomFormatter.

7. Literatura & Enlaces

Albahari, J., Albahari, B. (2012). C# 5.0 in a Nutshell. United States: O'Reilly Media.
Object.ToString Method (System) (2016, julio 14). Recuperado desde: https://msdn.microsoft.com/en-us/library/system.object.tostring%28v=vs.110%29.aspx
Tipos de Datos Básicos en C# (2016, julio 14). Recuperado desde: https://ortizol.blogspot.com.co/2013/07/tipos-basicos-en-c-parte-2.html
FormatException Class (System) (2016, julio 14). Recuperado desde: https://msdn.microsoft.com/en-us/library/System.FormatException.aspx
Excepciones en C#: Uso de Excepciones (2016, julio 14). Recuperado desde: https://ortizol.blogspot.com.co/2014/07/excepciones-en-csharp-parte-2-uso-de-excepciones.html
CultureInfo Class (System.Globalization) (2016, julio 14). Recuperado desde: https://msdn.microsoft.com/en-us/library/system.globalization.cultureinfo.aspx?f=255&MSPPError=-2147217396


O

No hay comentarios:

Publicar un comentario

Envíe sus comentarios, dudas, sugerencias, críticas. Gracias.