Foros del Web » Programación para mayores de 30 ;) » Java »

Pasar de letras a numeros

Estas en el tema de Pasar de letras a numeros en el foro de Java en Foros del Web. Estoy haciendo un programa en Java(netbeans 6.5) que reciba el nombre de un numero y me devuelva el numero en un messagebox POR EJEMPLO yo ...
  #1 (permalink)  
Antiguo 30/09/2009, 16:59
 
Fecha de Ingreso: septiembre-2009
Mensajes: 5
Antigüedad: 14 años, 6 meses
Puntos: 0
Pasar de letras a numeros

Estoy haciendo un programa en Java(netbeans 6.5) que reciba el nombre de un numero y me devuelva el numero en un messagebox

POR EJEMPLO
yo pongo ciento trece
y el programa devuelve 113

el problema es que si me paso de 200 el programa suma cadenas repetidas y me da un resultado mayor al que es------
este es mi codigo(soy principiante)


Código:
public class deletrasanumeros {


    public String paso(String nm){
    Integer cuento;
    cuento = 0;
        if (nm.equals("")) {
            JOptionPane.showMessageDialog(null, "No ha escrito nada");


        }
        if (nm.contains("uno")) {
         cuento = cuento + 1;
        }
    if (nm.contains("dos")) {
         cuento = cuento + 2;
        }
    if (nm.contains("tres")) {
         cuento = cuento + 3;
        }
    if (nm.contains("cuatro")) {
         cuento = cuento + 4;
        }
    if (nm.contains("cinco")) {
         cuento = cuento + 5;
        }
    if (nm.contains("seis")) {
         cuento = cuento + 6;
        }
    if (nm.contains("siete")) {
         cuento = cuento + 7;
        }
    if (nm.contains("ocho")) {
         cuento = cuento + 8;
        }
    if (nm.contains("nueve")) {
         cuento = cuento + 9;
        }
    if (nm.contains("diez")) {
         cuento = cuento + 10;
        }
    if (nm.contains("once")) {
         cuento = cuento + 11;
        }
    if (nm.contains("doce")) {
         cuento = cuento + 12;
        }
    if (nm.contains("trece")) {
         cuento = cuento + 13;
        }
    if (nm.contains("catorce")) {
         cuento = cuento + 14;
        }
    if (nm.contains("quince")) {
         cuento = cuento + 15;
        }
    if (nm.contains("dieciseis")) {
         cuento = cuento + 16;
        }
    if (nm.contains("diecisiete")) {
         cuento = cuento + 17;
        }
    if (nm.contains("dieciocho")) {
         cuento = cuento + 18;
        }
    if (nm.contains("diecinueve")) {
         cuento = cuento + 19;
        }
    if (nm.contains("veinte")) {
         cuento = cuento + 20;
        }
    if (nm.contains("veinti")) {
         cuento = cuento + 1;
        }
    if (nm.contains("treinta")) {
         cuento = cuento + 30;
        }
    if (nm.contains("cuarenta")) {
         cuento = cuento + 40;
        }

    if (nm.contains("cincuenta")) {
         cuento = cuento + 50;
        }
    if (nm.contains("sesenta")) {
         cuento = cuento + 60;
        }
    if (nm.contains("setenta")) {
         cuento = cuento + 70;
        }
    if (nm.contains("ochenta")) {
         cuento = cuento + 80;
        }
    if (nm.contains("noventa")) {
         cuento = cuento + 90;
        }
    if (nm.contains("cien")) {
         cuento = cuento + 100;
        }
    if (nm.contains("ciento")) {
         cuento = cuento + 100;
        }
    if (nm.contains("doscientos")) {
         cuento = cuento + 200;
        }
    if (nm.contains("trescientos")) {
         cuento = cuento + 300;
        }
    if (nm.contains("cuatrocientos")) {
         cuento = cuento + 400;
        }
    if (nm.contains("quinientos")) {
         cuento = cuento + 500;
        }
    if (nm.contains("seiscientos")) {
         cuento = cuento + 600;
        }
    if (nm.contains("setecientos")) {
         cuento = cuento + 700;
        }
    if (nm.contains("ochocientos")) {
         cuento = cuento + 800;
        }
    if (nm.contains("novecientos")) {
         cuento = cuento + 900;
        }
    if (nm.contains("mil")) {
         cuento = cuento + 1000;
        }
















    return cuento.toString();
    }
Alguien podria ayudarme??????
  #2 (permalink)  
Antiguo 30/09/2009, 19:41
Avatar de lobo_php  
Fecha de Ingreso: noviembre-2007
Ubicación: Cali-Colombia
Mensajes: 1.869
Antigüedad: 16 años, 5 meses
Puntos: 75
Respuesta: Pasar de letras a numeros

dosientos... como lo escribes, pon el caso que escribes y lo que te sale.

ahhh otra cosa, si pongo dos mil ciento cincuenta y tres, me apareceria: 21000100503???
__________________
Cabuntu.org - Difundiendo Software Libre en Cali, Colombia
Usuario Linux # 483175
  #3 (permalink)  
Antiguo 01/10/2009, 00:08
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 2 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
  #4 (permalink)  
Antiguo 01/10/2009, 14:13
 
Fecha de Ingreso: septiembre-2009
Mensajes: 5
Antigüedad: 14 años, 6 meses
Puntos: 0
Respuesta: Pasar de letras a numeros

Muchas gracias
  #5 (permalink)  
Antiguo 01/10/2009, 15:28
Avatar de lobo_php  
Fecha de Ingreso: noviembre-2007
Ubicación: Cali-Colombia
Mensajes: 1.869
Antigüedad: 16 años, 5 meses
Puntos: 75
Respuesta: Pasar de letras a numeros



muy bien compa, sabes cual es el problema?
se lo hiciste todo XD
__________________
Cabuntu.org - Difundiendo Software Libre en Cali, Colombia
Usuario Linux # 483175
  #6 (permalink)  
Antiguo 01/10/2009, 16:21
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 2 meses
Puntos: 260
Sonrisa Respuesta: Pasar de letras a numeros

Cita:
Iniciado por lobo_php Ver Mensaje

muy bien compa, sabes cual es el problema?
se lo hiciste todo XD
¿Como? ... Así :

Código Java:
Ver original
  1. package Letras;
  2.  
  3. import java.util.List;
  4. import java.util.StringTokenizer;
  5.  
  6. public class Main {
  7.  
  8.     String[] Letras = {"UNO", "DOS", "TRES", "CUATRO", "CINCO", "SEIS", "SIETE", "OCHO", "NUEVE",
  9.         "DIEZ", "ONCE", "DOCE", "TRECE", "CATORCE", "QUINCE", "DIECISEIS", "DIECISIETE", "DIECIOCHO", "DIECINUEVE",
  10.         "VEINTE", "TREINTA", "CUARENTA", "CINCUENTA", "SESENTA", "SETENTA", "OCHENTA", "NOVENTA",
  11.         "CIEN", "CIENTO", "DOSCIENTOS", "TRESCIENTOS", "CUATROCIENTOS", "QUINIENTOS", "SEISCIENTOS", "SETECIENTOS", "OCHOCIENTOS", "NOVECIENTOS"};
  12.  
  13.     Integer[] Valores = {1, 2, 3, 4, 5, 6, 7, 8, 9,
  14.         10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
  15.         20, 30, 40, 50, 60, 70, 80, 90,
  16.         100, 100, 200, 300, 400, 500, 600, 700, 800, 900};
  17.  
  18.     List lstLetras = java.util.Arrays.asList(Letras);
  19.  
  20.     public static void main(String[] args) {
  21.         new Main().Letras();
  22.     }
  23.  
  24.     public void Letras() {
  25.         StringTokenizer st = new StringTokenizer("CUATROCIENTOS OCHENTA Y CINCO MIL DOSCIENTOS DOCE");
  26.         Integer numero = 0;
  27.  
  28.         while (st.hasMoreTokens()) {
  29.             String t = st.nextToken();
  30.             if (t.equals("MIL")) {
  31.                 numero *= 1000;
  32.             }
  33.             if (lstLetras.indexOf(t) > -1) {
  34.                 numero += Valores[lstLetras.indexOf(t)];
  35.             }
  36.         }
  37.  
  38.         System.out.println("Resultado : " + String.valueOf(numero));
  39.     }
  40. }

Saludos,

EDIT: Ooops , no leí bien, creí que querías que lo pusiera todo.

Última edición por HackmanC; 01/10/2009 a las 16:22 Razón: Edit
  #7 (permalink)  
Antiguo 02/10/2009, 14:32
Avatar de lobo_php  
Fecha de Ingreso: noviembre-2007
Ubicación: Cali-Colombia
Mensajes: 1.869
Antigüedad: 16 años, 5 meses
Puntos: 75
Respuesta: Pasar de letras a numeros

jajaja no, al contrario, queria que pusieras menos XD
broma.

saludos.
__________________
Cabuntu.org - Difundiendo Software Libre en Cali, Colombia
Usuario Linux # 483175
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta

SíEste tema le ha gustado a 2 personas




La zona horaria es GMT -6. Ahora son las 05:45.