sábado, 23 de febrero de 2013

Algoritmos Java y VB 6.0

este algorimo, es desarrollado por mi, es muy optimo y rapido no usa recursividad ni uso de substrings excesivos, ni tampoco divisiones concurrentes, se puede acceder casi directo a las cadenas de lectura, solo calculando la posicion con simples operaciones aritmeticas, copiar y pegar en una clase. y llamar al metodo desde el main abajo anexo la explicacion del algoritmo y los links de los codigos fuentes.

Ej: (clase).readNumber( "28377273.83", ".", "pesos" )
salida>>  veintiocho millones trescientos setenta y siete mil doscientos setenta y tres pesos con 83 centavos

private static final int  Unidad = 1; 
private static final int  Decena = 10;
private static final int  Centena = 100;

public static String readNumber( String Number, String sepDecimal, String sMoney ){
      
      String  V[] = initVector(), s = "", z = "", c = "", e = " ", t;
      int l = Number.length(), k = Number.indexOf( sepDecimal ), u = 1, n = 0, j = 0, b = 0, d, p, r;
     
      try{

           //obtiene los decimales
            if( k >= 0 ) { c = Number.substring( k + 1, l );  l = k; }
           
            if ( l <= 15 )
            {
                        for( int i = l ; i >= 1; i-- ){
                            d = Integer.parseInt( String.valueOf( Number.charAt( i - 1 ) ));
                            n = ( d * u ) + n;

                                switch( u ){
                                    case Unidad:
                                        s = V[ n ];
                                        if ( i == l && n == 1 ) b++;
                                    break;
                     case Decena:                                               
                                        p = d - 2;
                                   
                                        if( p < 0 )  
                                            s = V[ n ];                                     
                                        else{
                                            t =  V[ 20 + p ];
                                           
                                            if( n % 10 != 0 )
                                               s  =  (d == 2)? "veinti" + s : t + " y " + s;
                                            else   
                                               s = t;
                                         }
                                    break;
                                    case Centena:
                                       p = d - 1;
                                       t = V[ 30 + p ];
        
                                       if( n % 100  == 0 )
                                       { s = ""; e = ""; } 
                                       else
                                         if( d == 1 ) t += "to"; 
                                      
                                       s = t + e + s;                                      
                                       z = ( s + z );  
                                    break;         
                                } 
                               
                                e = " ";    
                              //ini. calcula los miles, millones, billones
                                r = l - i;                               
                                if( r > 0 && r % 3 == 0  ){
                                        p = ( r > 2 )?  2 : j++ & 1;    
                                        t = V[ 40 + p ];
                                       
                                        if( p > 0 )
                                           if( ( n == 1 && i > 1 ) || n > 1  ) t += "es";
                                       
                                        z = e + t + e + z;
                                }
                              //fin.
                                

                               //reinicia las variables
                               if ( u == Centena ){  u = 1;  n = 0;  s = "";  } else u *= 10;                                
                         }
                      
             }     

           //ini. adiciona la moneda y los centavos
                if ( !c.equals("") ) c = " con " + c + " centavos";           
                if ( !sMoney.equals("") )       
                    sMoney = " " + sMoney;
                else
                    if( b > 0 ) z += "o"; 
           //fin.
           
            z = ( s + z ) + sMoney + c;
      }
      catch(NumberFormatException ex){
            z = "ERROR [readNumber]: Formato numerico incorrecto.";
      }
     
     return z;
    
   }

  
  
   private static String[] initVector(  ){
       String V[] = new String[43];
       
        V[0] = "cero";
        V[1] = "un";
        V[2] = "dos";
        V[3] = "tres";
        V[4] = "cuatro";
        V[5] = "cinco";
        V[6] = "seis";
        V[7] = "siete";
        V[8] = "ocho";
        V[9] = "nueve";
        V[10] = "diez";
        V[11] = "once";
        V[12] = "doce";
        V[13] = "trece";
        V[14] = "catorce";
        V[15] = "quince";
        V[16] = "dieciseis";
        V[17] = "diecisiete";
        V[18] = "dieciocho";
        V[19] = "diecinueve";
        V[20] = "veinte";
        V[21] = "treinta";
        V[22] = "cuarenta";
        V[23] = "cincuenta";
        V[24] = "secenta";
        V[25] = "setenta";
        V[26] = "ochenta";
        V[27] = "noventa";
        V[28] = "";
        V[29] = "";
        V[30] = "cien";
        V[31] = "doscientos";
        V[32] = "trescientos";
        V[33] = "cuatrocientos";
        V[34] = "quinientos";
        V[35] = "seiscientos";
        V[36] = "setecientos";
        V[37] = "ochocientos";
        V[38] = "novecientos";
        V[39] = "";
        V[40] = "mil";
        V[41] = "millon";
        V[42] = "billon";
       
        return V;
   }


}





 este tambien lo hice es a misma version pero en visual vb 6 y sin algunos ajustes que tiene el anterior JAVA





Const Unidad = 1
Const Decena = 10
Const Centena = 100
Const UMil = 1000
Const CMil = 100000
Const Millon = 1000000
Const UMMillon = 1000000000
Const CMMillon = 100000000000#
Const MMMillon = 1000000000000#



' CONVIERTE DE NUMERO A TEXTO
Public Function cvtNumTxt(Numero) As Variant
Const b = 10
Dim C, R, U, S, P, T, D, M, K, V()

Call LLenarVector(V)

C = Numero
L = False
U = 1
M = 1

If C <> "" Then
  If C > 0 Then
     Do
            P = ""
            R = ModL(C, b)
            C = Int(C / b)
            T = T + R * U
       
           ' VERIFICA LAS UNIDADES, DECENAS, CENTENAS
            If R > 0 Then
                Select Case U
                    Case Unidad
                        If M > 100 Then _
                           V(1) = "Un"
                        D = V(T)
                        If C = 0 Then P = D
                    Case Decena
                        If R = 1 Then
                          P = V(T)
                        Else
                          P = V(20 + (R - 2))
                          If T Mod b > 0 Then
                            If T >= 30 Then
                              P = P & " y " & D
                            Else
                              P = "Veinti" & LCase(D)
                            End If
                          End If
                        End If
                        P = " " & P
                    Case Centena
                        P = V(30 + (R - 1))
                        If T > 100 And T < 200 Then _
                           P = P & "to"
                        P = " " & P
               End Select
            Else
              If U = b Then P = " " & D
            End If
   
            If M > 100 Then
                ' VERIFICA LAS UNIDADES DE MIL, MILLONES Y BILLONES
                  Select Case M
                     Case UMil To CMil, UMMillon To CMMillon
                      If U = 1 And R = 1 Then P = ""
                        If T > 0 And K = 0 Then
                         P = P & " Mil"
                         K = 1
                       End If
                     Case Millon
                       P = P & " Millon"
                       If Not (T = 1 And C = 0) Then _
                           P = P & "es"
                       K = 0
                     Case MMMillon
                       P = P & " Billon"
                       If Not (T = 1 And C = 0) Then _
                            P = P & "es"
                       M = 1
                 End Select
              End If
            
            If U = Centena Then
                U = 1
                T = 0
                D = ""
            Else
               U = U * b
            End If
   
                     
        M = M * b
        S = P & S
                               
      Loop While (C <> 0)
           
    Else
       S = V(0)
    End If
End If

cvtNumTxt = Trim(S)

End Function



' PERMITE INTRODUCIR NUMEROS MAYORES A 1000 MILLONES PARA SOLUCIONAR ERROR EN MOD
Public Function ModL(Num1, Num2) As Variant
ModL = Num1 - (Int(Num1 / Num2) * Num2)
End Function




Private Sub LLenarVector(ByRef Vec)

ReDim Vec(43)

Vec(0) = "Cero"
Vec(1) = "Uno"
Vec(2) = "Dos"
Vec(3) = "Tres"
Vec(4) = "Cuatro"
Vec(5) = "Cinco"
Vec(6) = "Seis"
Vec(7) = "Siete"
Vec(8) = "Ocho"
Vec(9) = "Nueve"
Vec(10) = "Diez"
Vec(11) = "Once"
Vec(12) = "Doce"
Vec(13) = "Trece"
Vec(14) = "Catorce"
Vec(15) = "Quince"
Vec(16) = "Dieciseis"
Vec(17) = "Diecisiete"
Vec(18) = "Dieciocho"
Vec(19) = "Diecinueve"
Vec(20) = "Veinte"
Vec(21) = "Treinta"
Vec(22) = "Cuarenta"
Vec(23) = "Cincuenta"
Vec(24) = "Secenta"
Vec(25) = "Setenta"
Vec(26) = "Ochenta"
Vec(27) = "Noventa"
Vec(28) = ""
Vec(29) = ""
Vec(30) = "Cien"
Vec(31) = "Doscientos"
Vec(32) = "Trescientos"
Vec(33) = "Cuatrocientos"
Vec(34) = "Quinientos"
Vec(35) = "Seiscientos"
Vec(36) = "Setecientos"
Vec(37) = "Ochocientos"
Vec(38) = "Novecientos"

End Sub


13 comentarios:

  1. aca les dejo la explicacion del algoritmo http://convetirnumerosaletras.blogspot.com/2013/02/vi-valor-inicial.html

    ResponderEliminar
  2. links de descarga codigos fuente JAVA y VB:
    JAVA: https://rapidshare.com/files/448133697/LeerNumeroJava.rar
    VB 6.0: http://rapidshare.com/files/3778099346/LeerNumeroVB.rar

    ResponderEliminar
  3. wao, muchas gracias por el aporte! :)

    ResponderEliminar
  4. que tal Kelmer, super bien esta tu convertidor, yo usaba uno que solo te permitia convertir un numero "chico"(9 digitos) con este se superan las espectativas, puedo convertir cualquier numero hasta 15 digitos... el unico detalle que encontre es cuando se coloca un nro como este
    1000000=UN MILLON MIL(tendria que decir UN MILLON solamente)
    o el mismo caso
    2000000=DOS MILLON MIL
    segun mi entender estando fuera de lugar la expresion MIL al final de la respuesta!, quisiera saber si le podrias hechar un ojo a eso... gracias...

    ResponderEliminar
  5. Probando la versión JAVA tiene error con los millones, billones, miles:
    veintiocho billones trescientos setenta y siete billones doscientos setenta y tres Bolívares con 83 centavos

    ResponderEliminar
  6. Os dejo otro conversor por si interesa : http://convetirnumerosaletras.blogspot.com/2013/02/algoritmo.html

    ResponderEliminar
  7. El algoritmo no soluciona el problema de las tildes, se escribe "veintidós", "veintitrés", "un millón". Además, para el millón, billón y trillón, cuando la cifra es exacta siempre va precedida del artículo "un". Delante de mil no se escribe "uno", etc. Si la moneda es femenino "libra", el número no concuerda en el género. El problema es mucho más complicado de lo que parece, pueden ver todas las opciones en:

    http://tip.dis.ulpgc.es/numeros-texto

    ResponderEliminar
  8. realice unas modificaciones, convierte numeros a lestras hasta 1.000.000.000, https://github.com/KMURILLO-CO/Java-Number-To-Word-Spanish/blob/master/NumberToWordSpanish.java

    ResponderEliminar
  9. hola, yo soy inexperto pero necresito saber como hago para llamar a estas rutinas desde un word, si es que se puede.
    Es decir tengo un word que pongo importe en número con puntos y comas decimales y necesito que automaticamente añada el importe también en letras. Se puede??

    ResponderEliminar