New 2 Java: Suplementos

Una necesidad com�n de los desarrolladores en Java es convertir Strings a valores num�ricos. Una vez convertido, podemos manipular ese valor como cualquier otro dato primitivo (por ejemplo, un int, float, o double). El problema es que, cuando leemos desde un fichero, obtenemos un argumento de la l�nea de comandos, o s�lo solicitamos una entrada desde un campo de texto en un formulario, siempre empezamos con un objeto String. Tratar este String como un tipo primitivo requiere un paso extra, la conversi�n.

Para convertir un String a un tipo primitivo, debemos entender c�mo usar una clase envolvura. Todo tipo primitivo tiene asociada una clase envoltura. Estas clases nos permiten tratar a los tipos primitivos como objetos. Adem�s, estas clases contienen m�todos que permiten la manipulaci�n de estos objetos, apropiados para el tipo de datos.

La siguiente lista muestra el mapeo entre el tipo primitivo y su clase envoltura. En casi todos los casos, la clase envoltura tiene el mismo nombre que el tipo de datos primitivo con la primera letra en may�sculas.

byte - Byte
short - Short
int - Integer
long - Long
char - Character
float - Float
double - Double
boolean - Boolean

Cada una de estas clases envoltura (excepto la clase Character) tiene un m�todo que nos permitie convertir desde un String al tipo primitivo espec�fico. Simplemente llamando al m�todo desde la clase envoltura apropidada, y nuestro String ser� convertido en un tipo primitivo. Por ejemplo:

String myString = "12345";
int myInt = Integer.parseInt(myString);

convierte el contenido de la variable String myString a un objeto myInt. La conversi�n es as� de f�cil. El �nico truco es que la converis�n para cada tipo implica un �nico nombre de m�todo en cada clase envoltura. Todas excepto las conversiones booleanas se hacen por m�todos con nombres similares. Pero los nombres de los m�todos son diferentes:

byte - Byte.parseByte(aString)
short - Short.parseShort(aString)
int - Integer.parseInt(aString)
long - Long.parseLong(aString)
float - Float.parseFloat(aString)
double - Double.parseDouble(aString)
boolean - Boolean.valueOf(aString).booleanValue();

Hay una excepci�n: la clase Character no tiene dicho m�todo, por eso tenemos que preguntar al String por el car�cter con el m�todo charAt:

// The variable e is the character e in the string Hello
     String hello = "Hello";
     char e = hello.charAt(1);

Si el contenido del String no se puede convertir al tipo primitivo solicitado, se lanzar� una NumberFormatException. Esta es una excepci�n de tiempo de ejecuci�n, por lo que la conversi�n no tiene que estar en un bloque try-catch.

.�Entender la Librer�a de Clases Java

.�La Clase NumberFormat

Imprimir n�meros en la pantalla puede producir algunos resultados no desados. Por ejemplo:

public class PrintNum {
    public static void main(String args[]) {
      double amount = 400000.00;
      System.out.println("He paid " + amount 
                           + " for the house.");
        }
}

resulta en:

He paid 400000.0 for the house.

A�adir el s�mbolo $ en el string no mejorar� estos resultados porque los tipos primitivos se imprimen con el n�mero m�ximo de d�gitos distintos de cero para ese tipo, y las comas no est�n incluidas en el resultado.

Podemos controlar la forma de mostrar y ordenar entradas en el formato de salida necesario usando la clase abstracta NumberFormat del paquete java.text. Esta clase proporciona el interface para formatear y analizar n�meros, e incluye m�todos para determinar que localidades tienen formatos num�ricos y cu�les son sus nombres. La clase tiene m�todos para tres formatos est�ndards:

  • getInstance o getNumberInstance obtiene un formato para el formato de n�mero normal, como 600,000.
  • getCurrencyInstance obtiene un formato para el formato de n�mero monetario, como $600,000.00.
  • getPercentInstance obtiene un formato para mostrar porcentajes, como 56%

Para formatear un primitivo, empezamos devolviendo un objeto del tipo NumberFormat llamando a uno de los m�todos de arriba. Para usar el ejemplo anterior para que muestre $400,000, llamamos a:

 
NumberFormat nf = NumberFormat.getCurrencyInstance();

Para asegurarnos de que la cantidad est� formateada correctamente para un pa�s espec�fico, especificamos la localidad con:

NumberFormat nf = NumberFormat.getCurrencyInstance(Locale.US);

Ahora, el program de arriba se puede reescribir como:

import java.text.*;
import java.util.Locale;

public class PrintNum {
  public static void main(String args[]) {
    // Amount to be formatted
    double amount = 400000.00; 
    // Returns an object of type NumberFormat
    NumberFormat nf = 
       NumberFormat.getCurrencyInstance(Locale.US);
    // Calls the format method on the NumberFormat object
    // to format the amount as desired and prints the 
    // results to the screen
     System.out.println("He paid " +  nf.format(amount)
                           + " for the house.");
        }
}

Resultando en:

He paid $400,000.00 for the house.

.�Programa Ejercicio

Usa lo que has aprendido para crear una aplicaci�n que lea argumentos desde la l�nea de comandos. Las reglas para manejar estos argumentos son �stas:

  • Si el argumento es un entero, a�ade el valor a la respuesta.
  • Si el argumento es un n�mero en coma flotante, multiplica la respuesta por el valor.
  • Si no hay argumento, muestra el argumento inv�lido

Una vez procesados los argumentos, muestra el valor resultante como moneda, con el s�mbolo de la moneda, las comas para separar los miles (asumiendo la Localidad US), el punto decimal, y dos d�gitos despu�s del decimal. Cuando se ejecute con la siguiente l�nea de comando:

 
java Numbers 1 2 3 4 5 2.3 3 4 4444.4 a

Tu programa deeber�a presentar un resultado similar a este:

Arg: 10 invalid (a)
The answer is $184,442.60

.�Un poco de Java

.�AWT contra Swing

Un error com�n es pensar que el Project Swing es un reemplazo para el Abstract Window Toolkit (AWT). De hecho, Swing es un conjunto de componentes m�s ligeros construido sobre AWT.

Originalmente el AWT fue dise�ado para crear interfaces sencillos para applets. Swing proporciona reemplazos para los componentes de peso pesado del AWT y tambi�n incluye herramientas comunmente utilizadas en interfaces de usuario m�s complejos.

Un componente de peso pesado trata con el sistema de ventanas de la plataforma local para determinar el aspecto y comportamiento de los componentes. Todo componente de peso pesado tiene un par en el paquete java.awt.peer que es el responsable de las interacciones entre el componente y la plataforma local, como Mac, Windows y Solaris para mostrar y manipular el objeto.

Por otro lado, un componente de peso ligero, est� escrito completamente en lenguaje Java y no necesita un par nativo. Para conseguir el aspecto y comportamiento espec�fico de una plataforma, podemos usar la arquiectura Pluggable Look and Feel de Swing y su API.

En programaci�n de aplicaciones, los controladores de distribuci�n del AWT proporcionan una:

  • Distribuci�n para componentes organizados dentro de un panel.
  • Mecanismos de manejo de eventos para menejar la funcionalidad de los componentes AWT o Swing como botones, campos de texto o �reas de texto.

Para completar una aplicaci�n compleja escrita en Java, necesitar�s entender un poco sobre el AWT, y mucho sobre Project Swing.

.�Soluci�n al Programa de Ejercicio

Esta es una posible soluci�n al Programa del Ejercicio:

import java.text.*;
import java.util.Locale;

public class Numbers {
    public static void main(String args[]) {

      // Initialize total
      double answer = 0;

      // Working variable
      double number;

      // Loop through all the command line args
      for (int i=0; i < args.length; i++) {

        try {

          // First try to convert arg to an int
          number = Integer.parseInt(args[i]);
          // Add to total if int
          answer += number;

        } catch (NumberFormatException intTry) {

          try {

            // Next try to convert arg to a double
            number = Double.parseDouble(args[i]);
            // Multiple to total if double
            answer *= number;

          } catch (NumberFormatException doubleTry) {

            // Display message if neither int nor double
            System.err.println("Arg: " + (i+1) +
              " invalid (" + args[i] + ")");

          }
        }
      }

      // Create a currency display format with Local included
      NumberFormat nf =
                  NumberFormat.getCurrencyInstance(Locale.US);

      // Display output as US currency format
      System.out.println("The answer is " + nf.format(answer));
    }
}

.�Descargar la Plataforma Java 2

Para la mayor�a del desarrollo Java, necesitas las librer�as de clases Java, el compilador, las herramientas, y el entorno de ejecuci�n proporcionado por el kit de desarrollo de Java 2, Standard Edition.

COMPARTE ESTE ARTÍCULO

COMPARTIR EN FACEBOOK
COMPARTIR EN TWITTER
COMPARTIR EN LINKEDIN
COMPARTIR EN WHATSAPP
SIGUIENTE ARTÍCULO