Ver Mensaje Individual
  #3 (permalink)  
Antiguo 01/10/2009, 00:08
Avatar de HackmanC
HackmanC
 
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 3 meses
Puntos: 260
Sonrisa Respuesta: Pasar de letras a numeros

Hola,

Cita:
Iniciado por Kuronokei Ver Mensaje
... este es mi codigo(soy principiante) ...
Alguien podria ayudarme??????
¿Es un ejercicio de estudios avanzados en informática?
¿O lo seleccionaste para aprender más?

La solución de ese problema es moderadamente complejo, es parecido a un analizador sintáctico. Lo que te aconsejo es que comprendas bien el problema para facilitarte el desarrollo del mismo (inclusive te aconsejaría que no escribieras nada de código en ningún lenguaje hasta que lo tengas en papel, hasta que comprendas bien el problema).

Las siguientes reglas se aplican a este problema.
  • Del número 1 al 9 y del 11 al 15, solamente se lee su número. (UNO, SIETE, TRECE).
  • Del número 16 al 19, serían casos especiales. (DIEZ Y SIETE, DIECISIETE).
  • Los números de las decenas enteras 20, 30, etc., se lee el número y el siguiente se le aplica las reglas anteriores. (VEINTE Y CINCO). En esta regla creo que no es válido el caso VEINTICINCO, TREINTISEIS; pero si fuera así serían casos especiales.
  • Los números de las centenas enteras 100, 200, 300, etc., solamente se lee su número. (QUINIENTOS, SEISCIENTOS). El único caso especial es 'CIEN' y 'CIENTO'. En esta regla creo que no es válido el caso SIETE CIENTOS, se escribe junto.
  • Los números de los millares, bueno se multiplica el valor que lleva por 1000.
  • Los números de millones, etc., se multiplica el valor por un millón.
El proceso de leer el número es secuencial, en el sistema arábigo es importante la posición del número. Por ejemplo:

CUATRO MIL CUATRO

En ese caso si solo tomas en cuenta el cuatro sin saber su posición (como el caso de String.contains), entonces no puedes saber a cual 'cuatro' te refieres.

Inicialmente te aconsejaría que usaras un Array (arreglo[]), para guardar los números, de esa forma no tienes como mil lineas dentro del programa, haciendo comparaciones, Valor == XX, sino que puedes hacer un ciclo que busqué dentro del arreglo (preferiblemente convertido a una Collection (Colección)).

Código Java:
Ver original
  1. String[] Letras = {"UNO", "DOS", "TRES", "CUATRO", "CINCO", "SEIS", "SIETE", "OCHO", "NUEVE",
  2.         "DIEZ", "ONCE", "DOCE", "TRECE", "CATORCE", "QUINCE", "DIECISEIS", "DIECISIETE", "DIECIOCHO", "DIECINUEVE",
  3.         "VEINTE", "TREINTA", "CUARENTA", "CINCUENTA", "SESENTA", "SETENTA", "OCHENTA", "NOVENTA",
  4.         "CIEN", "CIEN... (acá van solamente las centenas)
Y lógicamente necesitas otro arreglo para guardar los valores. (Aunque podríamos mencionar un error de 'patterns', llamado 'Arrays Paralelos', pero por simplicidad se pueden usar los 2 arrays)

Código Java:
Ver original
  1. Integer[] Valores = {1, 2, 3, 4, 5, 6, 7, 8, 9,
  2.         10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
  3.         20, 30, 40, 50, 60, 70, 80, 90,
  4.         100, 100, ...

Para poder accesar los datos del arreglo 'Letras' fácilmente, posiblemente necesites convertirlo en una Collección. Por ejemplo:

Código Java:
Ver original
  1. List lstLetras = java.util.Arrays.asList(Letras);

Dentro de la aplicación para ir leyendo las letras, necesitas un procedimiento que vaya leyendo secuencialmente, para eso te aconsejaría usar StringTokenizer (que esta 'deprecated', que ya no se debe usar, pero por simplicidad puedes usarlo). Y el algoritmo sería algo así:

Código Java:
Ver original
  1. while (hasMoreTokens()) {
  2.             String t = nextToken();
  3.             if (equals("MIL")) {
  4.                 numero *= 1000;
  5.             }
  6.             // .. mas casos especiales como el de 1000
  7.             if (lstLetras.indexOf(t) > -1) {
  8.                 numero += Valores[lstLetras.indexOf(t)];
  9.             }
  10.         }
Para ir corrigiendo los posibles errores que vas a ir encontrando, ingresa un número del 1 al 15 y ve el resultado, y así sucesivamente con cada caso. (Para darte un adelanto, no tienes que tomar en cuenta el caso especial de DIEZ Y SIETE, puesto que el valor de DIEZ es 10 y el de SIETE es 7, y la letra 'Y' te la saltas, al final el algoritmo suma 10 + 7).

Espero que sea de alguna ayuda,
Saludos