Page 1 of 1

Rutina numero a letras

Posted: Wed Mar 28, 2012 5:33 pm
by jcaro
Hola Amigos del Foro:

Alguien tiene por ahí una función para pasar un número a letras , por ejemplo $ 15.000 ,
que diga quince mil .

Necesito que sea para grandes cifras.

Cualquier ayuda, se agradece.

Saludos,

JC

Re: Rutina numero a letras

Posted: Wed Mar 28, 2012 5:46 pm
by acuellar
JC

Analiza este link
http://forums.fivetechsupport.com/viewt ... ral#p87963

Saludos,

Adhemar

Re: Rutina numero a letras

Posted: Wed Mar 28, 2012 5:48 pm
by Jairo Barbosa

Re: Rutina numero a letras

Posted: Wed Mar 28, 2012 6:58 pm
by jcaro
Muchas gracias Adhemar y Jairo por los link.

Hay bastante para analizar.

Saludos ,
JC

Re: Rutina numero a letras

Posted: Fri Mar 30, 2012 12:12 pm
by MarioG
JC;
De este foro bajé el siguiente código (aunque no recuerdo si de un post o de Utilidades)

Code: Select all

/***************
   Prog        : NumLetra.prg
   Autor       : Hernan Diego Checarelli
   Módulo      :
   Inicio      : 14/01/2010 - Bajado del Foro FiveTech
               ***************************************
*/


FUNCTION NumLetras( nImporte, nDec )

   local cTexto:= '' /// Equivale a '999999999999.99'
   local cPicture:=  Replicate('9',12)
   local lSonSoloCentavos:= .F., nCpn
   local cNumero,aU,aD,aV,aC,aE,aM
   local nImporteDec:= 0

   DEFAULT nDec:= 2

   if nImporte < 0
      cTexto:= 'Menos'
      nImporte *=-1   /// Lo paso a positivo
   endif

   if nDec == 0
      nImporte:= Int( nImporte )
   endif

   if nDec > 0
      cPicture+= '.' + Replicate('9', nDec)
   endif

   if nImporte < 1 .and. nImporte > 0  // Solo Decimales
      nImporteDec:= Val( SubStr( Transform( nImporte, "9.9999999999999999" ), 3, nDec ) )
      nImporte   := Val( AllTrim(Str(Int(nImporte))) + "." + AllTrim(Str(Int(nImporteDec))) )
   endif

   //// Evaluo la cadena numerica ,dividiendola en cuadro partes:
   //// 999 - 999 - 999 - 999 y los decimales correspondientes.

   cNumero := Transform( nImporte , cPicture )
   nImporte:= Val( cNumero )

   do case
      case nImporte  == 0 .and. nImporteDec == 0
         cTexto  := 'Cero'

      case nDec > 0 .and. nImporteDec > 0
         nImporte:= nImporteDec
         cNumero := Transform( nImporte , cPicture )
         lSonSoloCentavos:= .T.
   endcase


   aU:= {'Uno','Dos','Tres','Cuatro','Cinco','Seis','Siete','Ocho','Nueve'}
   aD:= {'Once','Doce','Trece','Catorce','Quince','Dieciseis','Diecisiete',;
         'Dieciocho','Diecinueve'}
   aV:= {'Diez','Veinte','Treinta','Cuarenta','Cincuenta','Sesenta','Setenta',;
         'Ochenta','Noventa'}
   aC:= {'Ciento','Doscientos','Trescientos','Cuatrocientos','Quinientos',;
         'Seiscientos','Setecientos','Ochocientos','Novecientos'}
   aE:= {'Veintiuno','Veintidos','Veintitres','Veinticuatro','Veinticinco',;
         'Veintiseis','Veintisiete','Veintiocho','Veintinueve'}
   aM:= {'Billones','Millones','Mil','/100'}


   for nCpn = 1 to 4  /// Los 4 '999'

      //// Analizo 1er. 9 ///
      if Val(SubStr(cNumero,1,1)) <> 0  // Si existe Centena !!!
         do case
            case SubStr(cNumero,1,3) == '100'
               cTexto:= AllTrim(cTexto) + Space(1) + SubStr(aC[1],1,4)
            otherwise
               cTexto:= AllTrim(cTexto) + Space(1) + aC[Val(SubStr(cNumero,1,1))]
         endcase
      endif

      //// Analizo 2do. 9 ///
      if Val(SubStr(cNumero,2,1)) <> 0  // Si existe Decena !!!
         do case
            case SubStr(cNumero,2,1) == '1' .and. SubStr(cNumero,3,1) <> '0'
               cTexto:= AllTrim(cTexto) + Space(1) + aD[ Val(SubStr(cNumero,3,1)) ]
            case SubStr(cNumero,2,1) == '2' .and. SubStr(cNumero,3,1) <> '0'
               cTexto:= AllTrim(cTexto) + Space(1) + aE[ Val(SubStr(cNumero,3,1)) ]
            otherwise
               cTexto:= AllTrim(cTexto) + Space(1) + aV[ Val(SubStr(cNumero,2,1)) ]
         endcase
      endif

      //// Analizo 3er. 9 ///
      if Val(SubStr(cNumero,3,1)) <> 0 // Si existe la Unidad !!!
         do case
            case SubStr(cNumero,2,1) == '1' .or. SubStr(cNumero,2,1) == '2'
            // Del 1 al 29 ya se habrian definido antes.-
            otherwise
               if Val(SubStr(cNumero,1,2)) <> 0 .and. Val(SubStr(cNumero,2,1)) <> 0
                  cTexto:= AllTrim(cTexto)+' y'
               endif
               cTexto:= AllTrim(cTexto) + Space(1) + aU[ Val(SubStr(cNumero,3,1)) ]
         endcase

         if nCpn <> 4 .and. SubStr(cNumero,3,1) == '1' .and. ;
            SubStr(cNumero,2,1) <> '1'

            cTexto:= SubStr( AllTrim(cTexto), 1, Len(AllTrim(cTexto))-1 )
            /// Sino quedaria Uno millon o Uno mil => Le saco el ultimo caracter.

         endif
      endif

      if nCpn < 4

          if ! Val(SubStr(cNumero,1,3)) == 0
             cTexto:= AllTrim(cTexto) + Space(1) + aM[nCpn]
          endif

          if (nCpn == 1 .or. nCpn == 2) .and. Val(SubStr(cNumero,1,3)) == 1  /// '  1'
             cTexto:= SubStr( AllTrim(cTexto) , 1, Len(AllTrim(cTexto))-4) + 'ón'
             /// Le saco el 'ones' y le pongo 'ón'
          endif

      endif

      cNumero:= SubStr( cNumero , 4 )

   next

   cNumero:= SubStr(cNumero,2,2)  /// Decimales del Nro.

   if Val(cNumero) <> 0  // Si tiene decimales
      cTexto:= AllTrim(cTexto)+' Con '+ cNumero +"/1"+Replicate("0",nDec)
   endif

   if lSonSoloCentavos

      cTexto:= StrTran(cTexto,'Uno','Un ')
      cTexto:= AllTrim(cTexto) + ' Centavo'
      if nImporte > 1
         cTexto+= 's'
      endif

      if nDec <> 2 // No le Cabe la palabra "centavo<s>" cuando nDec no es 2.
         cTexto:= "Cero Con " + AllTrim(Str(nImporteDec))+"/1"+Replicate("0",nDec)
      endif

   endif

RETURN( AllTrim( cTexto ) )

Re: Rutina numero a letras

Posted: Fri Mar 30, 2012 2:49 pm
by Hernan Diego Ceccarelli
Que buena Funcion :mrgreen:

Re: Rutina numero a letras

Posted: Fri Mar 30, 2012 3:10 pm
by jbrita
Hernan que bueno tenerte por aca

Saludos

Re: Rutina numero a letras

Posted: Fri Mar 30, 2012 3:35 pm
by jcaro
Gracias MarioG, la vamos a mirar tambien.

Saludos,
JC

Re: Rutina numero a letras

Posted: Fri Mar 30, 2012 8:19 pm
by MarioG
Buenísima funcion :mrgreen:
Saludos

Re: Rutina numero a letras

Posted: Sun Apr 08, 2012 4:42 pm
by ARCC
Buen día para todos...

Años sin postear!!! :shock: :shock: :shock:

Bueno por acá les dejo una función que hice y coloqué en el foro hace años. En las primeras líneas de código pueden configurar la moneda que van a utilizar.

Code: Select all

//*******######
Function Num2Txt(nCantidad)
//*******######

  //Utilice o cambie estos valores según su moneda
  Local acMoneda      := {" Bolívar ", " Bolívares "} //Moneda   en singular y plural
  Local acCentimos    := {" Céntimo" , " Céntimos"}   //Céntimos en singular y plural
  Local lCentsEnletra := .f. //Si es falso muestra los centimos en formato 00/100

  Local aTexto[5]
  Local cCadena, cDigitos, cTerminador, cCents
  Local nI, nJ, nNumero, nEntero, nCents, nPunto

  Local aUni:= {"Un"  , "Dos"  , "Tres", "Cuatro", "Cinco",;
                "Seis", "Siete", "Ocho", "Nueve"}

  Local aDec:= {"Diez"   , "Veinte" , "Treinta", "Cuarenta", "Cincuenta",;
                "Sesenta", "Setenta", "Ochenta", "Noventa"}

  Local aCen:= {"Cien"         , "Doscientos" , "Trescientos",;
                "Cuatrocientos", "Quinientos" , "Seiscientos",;
                "Setecientos"  , "Ochocientos", "Novecientos"}

  Local aAux1:= {"Once"     , "Doce"      , "Trece"    , "Catorce", "Quince",;
                 "Dieciseis", "Diecisiete", "Dieciocho", "Diecinueve"}

  Local aAux2:= {"Veintiún"   , "Veintidós" , "Veintitrés", "Veinticuatro",;
                 "Veinticinco", "Veintiséis", "Veintisiete",;
                 "Veintiocho" , "Veintinueve"}

  //Verifica el tamaño del número
  IF nCantidad > 9999999999999.99
     MsgStop("Número muy grande para convertir en letras",;
             "Mensaje de la Función Num2Txt")
     Return nCantidad
  EndIf

  AFill(aTexto, "")
  nCantidad:= Round(nCantidad, 2) //Redondea a 2 los decimales
  nEntero  := Int(nCantidad)
  cCents   := StrTran(Str(nCantidad - nEntero), "0.", "")
  nCents   := Val(cCents)

  If (nEntero == 0) .AND. (nCents == 0)

     If lCentsEnletra
        Return "Cero" + acMoneda[2] + "con Cero"   + acCentimos[2]
     else
        Return "Cero" + acMoneda[2] + "con 00/100" + acCentimos[2]
     EndIF

  ElseIf (nCents == 1) .AND. (nCents == 0)

     If lCentsEnletra
        Return "Un" + acMoneda[1] + "con Cero"   + acCentimos[2]
     else
        Return "Un" + acMoneda[1] + "con 00/100" + acCentimos[2]
     EndIf
  EndIf

  cCadena:= StrTran(Str(nEntero, 15), " ", "0")

  nJ:= 0
  For nI:= 1 To 15 step 3

      nJ:= nJ + 1
      cDigitos:= SubStr(cCadena, nI, 3)
      nNumero := Val(SubStr(cDigitos, 1, 1))

      If (nNumero != 0)
         aTexto[nJ]:= aTexto[nJ] + aCen[nNumero]
      EndIf

      If (nNumero = 1 .AND. Val(SUbStr(cDigitos, 2, 2)) != 0)
     aTexto[nJ]:= aTexto[nJ] + "to "
      Else
         aTexto[nJ]:= aTexto[nJ] + " "
      EndIf

      nNumero:= Val(SubStr(cDigitos, 2, 2))

      If (nNumero != 0)

         If (nNumero % 10) == 1
            cTerminador:= "Un "

         ElseIf (nNumero % 10) != 0
        cTerminador:= aUni[(nNumero % 10)]

     EndIf

         Do Case
            Case nNumero % 10 = 0
             aTexto[nJ]:= aTexto[nJ] + aDec[Int(nNumero / 10)] + " "

        Case nNumero > 0 .AND. nNumero < 10
             aTexto[nJ]:= aTexto[nJ] + cTerminador + " "

            Case nNumero > 10 .AND. nNumero < 20
                 aTexto[nJ]:= aTexto[nJ] + aAux1[(nNumero % 10)] + " "

            Case nNumero > 20 .AND. nNumero < 30
                 aTexto[nJ]:= aTexto[nJ] + aAux2[(nNumero % 10)] + " "

            Case nNumero > 30 .AND. nNumero < 100
                 aTexto[nJ]:= aTexto[nJ] + aDec[Int(nNumero / 10)] + " y " + cTerminador + " "
         EndCase
      EndIf

      aTexto[nJ]:= AllTrim(aTexto[nJ])
  Next

  For nI:= 1 To 5
      If (Len(aTexto[nI]) != 0)
         Do Case
            Case nI = 1
                 aTexto[nI]:= aTexto[nI] + IIf(Left(aTexto[nI], 2) = "Un", " Billón", " Billones")

            Case nI = 2
                 aTexto[nI]:= aTexto[nI] + IIf(Len(aTexto[3]) = 0, " Mil Millones", " Mil")

            Case nI = 3
                 aTexto[nI]:= aTexto[nI] + IIf(Left(aTexto[nI], 2) = "Un", " Millón", " Millones")

            Case nI = 4
                 aTexto[nI]:= aTexto[nI] + " mil"
         EndCase
      EndIf
  Next

  //Genera el número entero
  cCadena := LTrim(aTexto[1] + " " + aTexto[2] + " " + aTexto[3] + " " + ;
                   aTexto[4] + " " + aTexto[5]) + IIf(nEntero == 1, acMoneda[1], acMoneda[2]) + "con "

  //Genera el número entero más decimales
  If lCentsEnletra //Si los céntimos son en letras
     If (nCents % 10) == 1
        cTerminador:= "un "

     ElseIf (nCents % 10) != 0
        cTerminador:= aUni[(nCents % 10)]

     EndIf

     Do Case

        Case nCents = 0
             cCadena := cCadena + "Cero"

        Case nCents % 10 = 0
             cCadena := cCadena + aDec[Int(nCents / 10)]

        Case nCents > 0 .AND. nCents < 10
             cCadena := cCadena + aUni[nCents]

        Case nCents > 10 .AND. nCents < 20
             cCadena := cCadena + aAux1[(nCents % 10)]

        Case nCents > 20 .AND. nCents < 30
             cCadena := cCadena + aAux2[(nCents % 10)]

        Case nCents > 30 .AND. nCents < 100
             cCadena := cCadena + aDec[Int(nCents / 10)] + " y " + cTerminador
     EndCase

     If nEntero = 0
        cCadena := "Cero" + cCadena + acCentimos[2]
     ElseIf nCents = 1
        cCadena := cCadena + acCentimos[1]
     Else
        cCadena := cCadena + acCentimos[2]
     EndIf

  Else //Si los céntimos son en números

     If nEntero = 0
        cCadena := "Cero" + cCadena + Right(cCents, 2) + "/100" + acCentimos[2]
     Else
        cCadena := cCadena + Right(cCents, 2) + "/100" + acCentimos[2]
     EndIf
  EndIf
Return cCadena