leer un numero???

nuria
20 de Diciembre del 2001
Hola:

Necesito una rutina q haga lo siguiente:
le paso un numero con dos decimales: 1234,34 y me devuelve un string: mil doscientos treinta y cuatro con treinta y cuatro. Alguien tiene algo parecido??? gracias!!!

Angel
20 de Diciembre del 2001
Mira Nuria, lo que pides es algo tan poco usual que no existe ningún método en el API de java que te permita hacer esto. Por tanto te lo tienes que currar tu misma, y no es tan difícil como parece.

Lo que tienes que hacer es ir leyendo los números y determinar si son centenas, decenas unidades, décimas, centésimas, .... Y asignarle a cada un de esos números un valor string.

Oblongo
20 de Diciembre del 2001
Te pongo un ejemplo de rutina que lee los numeros desde el 0.00 hasta el 9.99.
Se puede depurar más para que "lea" mejor los números, por ejemplo que el 5.15 no lo lea como 5 con diez y cinco sino como cinco con quince, pero eso es añadir if.
Con esta como base puedes seguir añadiendo decenas, centenas, unidades de millar etc... casi es repetir parte de este código.

Se podría hacer un código más elegante, pero ando escaso de tiempo.
He metido algún comentario por si querías mirarlo un poco y seguir ampliando hasta llegar a leer números del orden de miles.

import java.lang.Math;

class leer {

static String leeNumero (double num) throws NumberFormatException {
Double numero = new Double(num); // se crea un objeto Long con el numero
String unidades [] = {"cero","uno","dos","tres","cuatro","cinco","seis","siete","ocho","nueve"};
String decimas [] = {"cero","diez","veinte","treinta","cuarenta","cincuenta","sesenta","setenta","ochenta","noventa"};
String cadenaDeNumero = numero.toString(); // Convierto el dato a cadena.
String entero="0",decima="0",centesima="0";
Integer intEntero,intDecima,intCentesima;
String numeroLeido= "";

if ((num < 0) && (num > 9)) {
throw new NumberFormatException ("El numero ha de estar entre 0.00 y 9.99");
}

entero = cadenaDeNumero.substring(0,1);
decima = cadenaDeNumero.substring(2,3);

// Como hago la conversion de num a un objeto Double, Java los numeros
// de la forma X.X0 los deja en X.X, no pasa lo mismo con los numeros
// X.0. Esto es importante porque al pasarlo a una cadena perdemos una
// posicion y por tanto el numero 4.80 por ejemplo, java lo mete en el
// objeto como 4.8, es decir antes la cadena media 4 y ahora mide 3.
// por eso a las centesimas las meto en un if.

if (cadenaDeNumero.length() == 4) {
centesima = cadenaDeNumero.substring(3,4);
}

intEntero = new Integer(entero);
intDecima = new Integer(decima);
intCentesima = new Integer(centesima);

// Ahora comenzamos a reconstruir el numero "leido"

// metemos la parte entera (unidades)

numeroLeido = unidades[intEntero.intValue()]+" con ";

// La variable leeY los que determina es la forma de leer
// un numero. El numero 5.04 normalmente se lee "cinco con cero cuatro"
// y no "cinco con cero y cuatro". Por eso esta variable.

String leeY = " y ";

if (intDecima.intValue() == 0) {
// si las d‚cimas son 0, el numero es de la forma 6.04, 1.00...
// entonces la "y" se quita.
leeY = " ";

}

if (intCentesima.intValue() == 0) {
// si las centesimas son 0, el numero es de la forma 6.8, 1.2...
numeroLeido += unidades[intDecima.intValue()];
} else {
// si las centesimas no son 0 el numero es de la forma 5.89, 4.02...
numeroLeido += decimas[intDecima.intValue()] + leeY + unidades[intCentesima.intValue()];
}

return (numeroLeido);
}


public static void main (String args[]) {

try {
System.out.println (leeNumero (0.14));
System.out.println (leeNumero (0.20));
System.out.println (leeNumero (9.99));
System.out.println (leeNumero (3.87));
System.out.println (leeNumero (1.00));
System.out.println (leeNumero (5.55));

} catch (NumberFormatException e) {
System.out.println (e);
}
}
}

La salida que da el programa a esos números que te pongo como ejemplo es:

cero con diez y cuatro
cero con dos
nueve con noventa y nueve
tres con ochenta y siete
uno con cero
cinco con cincuenta y cinco

Para compilarlo mete todo el codigo en un fichero llamado leer.java


Yo mismo
20 de Diciembre del 2001
Me he dado cuenta de que la condición:
if (num < 0 && num >9) { .... }
no hace nada, porque un número no puede ser mayor y menor que 9 y 0 a la vez. La condición correcta es.
if (num < 0 || num >= 10) { throw ..... ;}
Así si que se lanza la excepción.
Perdón por el fallo.

sagato
20 de Diciembre del 2001
debes de declararla o bien en la clase (aunque no lo creo)o en la funcion principal.

nuria
20 de Diciembre del 2001
Muchas gracias por tu ayuda ;-) estoy trabajando en ello!!!

Un saludo,