domingo, 10 de marzo de 2013

Trucos para el formateo de cadenas y fechas en Java

Una de las cosas que tienden a resultar mas llamativas cuando se pasa del C al Java es la gran cantidad de herramientas que este ultimo proporciona para el manejo de cadenas de texto, ya que, si si bien estas existen en C, las versiones del Java tienden a ser un tanto mas fáciles de usar y la sobrecarga de funciones se aprovecha muy bien para hacer el código mas legible y compacto que el equivalente en C.

Claro que ayuda mas si se sabe como se llaman y se usan dichos métodos y dado que he tenido que usarlos recientemente creo que seria bueno poner aquí lo que he encontrado.

Ejemplo: Obteniendo datos de un "numero" folio

Numero entre comillas pues mas que un numero es un conjunto de datos, la mayoria numericos.
El ejemplo que se usara es bastante sencillo, tenemos un numero de folio en este formato:

B0075801003130500

 
Las secciones que componen el folio se colorearon diferente para que sean mas faciles de distinguir, notamos cuatro secciones.

  1. La serie del folio en negro
  2. El numero de folio en rojo
  3. La fecha de expiración en azul
  4. El valor del documento con ese folio (en este ejemplo son vales)

Y la pregunta principal, ¿Como sacamos esos datos del folio y los pasamos a un formato mas útil?, como pasar el numero de folio y el valor a enteros y la fecha a un objecto Date.

Por fortuna la clases String, Integer y SimpleFormatDate de Java nos proporcionan los métodos para realizar eso de forma sencilla y claram los metodos en los que nos enfocaremos son:

String.substring

Este método nos regresa una cadena de texto compuesta por los caracteres entre las posiciones, comenzando a contar desde cero,  indicadas en los argumentos, tiene dos sobrecargas principales que son:

.substring(int inicio)
Toma un solo argumento y regresa la cadena compuesta por todos los caracteres empezando desde esa posición.

.substring(int inicio, int fin)
Este metodo nos regresa la cadena delimitada entre los dos argumentos, pero tiene un detalle en extremo importante que se debe considerar ya que regresa los caracteres desde inicio hasta fin-1por lo que se debe de tomar eso en cuenta a la hora de contar los caracteres

Con ambos metodos facilmente podemos obtener los valores del numero de folio y el valor del mismo, ahora para convertirlos en enteros usaremos el metodos parseInt de la clase Integer

Integer.parseInt(string value)

El uso de este método es bastante sencillo, basta pasarle como argumento una cadena de texto y regresara un entero con el valor representado en la cadena.

SimpleDateFormat.parse(string date)

Ya solo queda obtener un objecto Date que contenga la fecha en el folio, para esto se hará uso de la clase SimpleDateFormat contenida en el paquete java.text, la función de esta clase es convertir una cadena de texto, en un formato preestablecido, en el objecto Date correspondiente.

Para hacer uso de esta clase se necesita realizar tres pasos que son

  1. Crear un objecto SimpleDateFormat pasando al constructor el formato en el que estaran los datos.
  2. Usar el método parse pasando como argumento la cadena de texto que representa la fecha, este nos regresara el objecto Date.
  3. Capturar la excepción ParseException que el método lanza en caso de aparecer un error.
El paso tres ciertamente parece extraño, pero es una medida para evitar errores en los datos.

Ya para concluir y hacer mas claro cualquier detalle en el uso de estas clases aqui esta el ejemplo mencionado con el folio en el formato descrito al comenzar.


package mx.com.omega.parse;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class StringParse {

    /**
     * @param args
     */
    public static void main(String[] args) {
        String folio = "A0075801004130500";
        String tmp;
        char serie;
        int numFolio;
        int monto;
        Date fecha;
        SimpleDateFormat formato=null;
      
        // charAt nos entrega el caracter en la posicion indicada
        serie = folio.charAt(0);
      
        // subString nos da la cadena que va desde el argumento1 hasta argumento2-1
        tmp = folio.substring(1, 7);
        numFolio = Integer.parseInt(tmp);
      
        formato = new SimpleDateFormat("ddMMyy");
        tmp = folio.substring(7, 13);
      
        try {
            fecha = formato.parse(tmp);
        } catch (ParseException e) {
            // TODO Bloque catch generado automáticamente
            e.printStackTrace();
            fecha = null;
        }
              
        // Este overload obtiene la cadena desde el argumento hasta el final
        tmp = folio.substring(13);
        monto = Integer.parseInt(tmp);
      
        formato = new SimpleDateFormat("yyyy-MM-dd");
      
        System.out.println("Serie del tiquet:\t" + serie);
        System.out.println("Numero de folio :\t" + numFolio);
        System.out.println("Denominacion del tique:\t$" + monto);
        System.out.println("Vigencia del tiquet:\t" + formato.format(fecha));
      
    }

}


De nuevo esperando que todo esto sea de utilidad y nos vemos luego.