domingo, 21 de noviembre de 2010

Formateando que es gerundio

En muchas ocasiones es necesario formatear las entradas de datos.

Por ejemplo, algunos clientes quieren que los números se muestren con separadores decimales, otros quieren que cuando se trate de dinero se muestre además de todo lo dicho anteriormente el símbolo del euro. No debemos olvidar que para muchos clientes el la aplicación de referencia es office, así que te dirán “como en office”.

En este post no me voy a detener en como hacer la máscara, existen varias soluciones (Javascript, JQuery, Ajax.Net Control Toolkit). Lo que me resulta sorprendente es la distintas formas que me he encontrado cuando en .Net (y supongo que en Java habrá una forma similar) de dar formatos a los números o recuperar el texto de nuestro interfaz y guardarlo como número en nuestra aplicación.

Primero debemos saber como transformar un número, al formato que nos pide el cliente. He visto en muchas ocasiones como los programadores parsean de forma manual los números. Imaginemos un decimal, habría que separar la parte decimal de la parte entera, dividir de tres en tres la parte entera poniendo “.” y luego poniendo una “,” y adjuntando la parte decimal. La solución nos la da el framework en una única línea.

Supongamos que tenemos una página asp.net con una caja de texto que se llama txtMoneda en la que queremos escribir un valor numérico con el formato moneda del excel, es decir solo con dos decimales, separador de millares, separador decimal y el símbolo del euro. ¿como lo hacemos? con solo una línea:

txtMoneda.Text = initMoneda.ToString("C"); //Formato moneda


Todos los tipos numéricos tienen sobrecargado el ToString, en esta entrada de la msdn se encuentra la información necesaria.


Una vez que mostramos el texto formateado, nos falta recuperar el valor del control a nuestra variable, en este caso de tipo decimal. En .Net los tipos numéricos tienen dos métodos parse y tryparse, los dos hacen lo mismo: transforman al tipo decimal concreto. A la hora de trabajar con la capa de la vista, lo recomendable es usar tryParse. Este método solo acepta strings de entrada (que es lo que nos va a dar nuestro control), y no obtiene la cultura por defecto asi que se la tenemos que especificar, pero nos ahorramos un try para comprobar si el string de entrada.


En nuestro ejemplo para recuperar del input el valor en decimal sería algo parecido a esto:


if (!decimal.TryParse(txtMoneda.Text, NumberStyles.Number, CultureInfo.CurrentCulture, out moneda))
{
//TODO:Notificar Error
}



El enumerado NumberStyle contiene muchos estilos que se pueden utilizar de forma combinada, tal y como se muestra en su entrada de la msdn


Usando parse o tryparse, no estamos obligado a usar una mascara en nuestros controles. En nuestro ejemplo, todas esta combinaciones sería válidas:


  • 1.234,56


  • 1234,56


  • 1234


  • 1234,56 €


  • 1.234,56 €


  • 1234 €



Moraleja: para esas cosas básicas que deberían estar en el framework integradas, con casi toda seguridad lo están, consulta la msdn.