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.
- Descarga el Paquete de Software J2SE 1.4.
- A�ade a tu Bookmark las Especificaciones del API