Rutina numero a letras

Post Reply
jcaro
Posts: 270
Joined: Fri Nov 11, 2005 7:39 pm

Rutina numero a letras

Post 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
User avatar
acuellar
Posts: 1645
Joined: Tue Oct 28, 2008 6:26 pm
Location: Santa Cruz-Bolivia

Re: Rutina numero a letras

Post by acuellar »

Saludos,

Adhemar C.
User avatar
Jairo Barbosa
Posts: 194
Joined: Fri Jan 23, 2009 2:50 am
Location: Cali Valle Colombia
Contact:

Re: Rutina numero a letras

Post by Jairo Barbosa »

jcaro
Posts: 270
Joined: Fri Nov 11, 2005 7:39 pm

Re: Rutina numero a letras

Post by jcaro »

Muchas gracias Adhemar y Jairo por los link.

Hay bastante para analizar.

Saludos ,
JC
Juan
==> Pasando a FWH16.04 + Harbour32 + BCC70 + PellesC
=> Abandonando FWH 13.7 + xHarbour + BCC582
http://www.mitaller.cl
User avatar
MarioG
Posts: 1380
Joined: Fri Oct 14, 2005 1:28 pm
Location: Resistencia - Chaco - AR
Been thanked: 2 times

Re: Rutina numero a letras

Post by MarioG »

JC;
De este foro bajé el siguiente código (aunque no recuerdo si de un post o de Utilidades)

Code: Select all | Expand

/***************   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   endifRETURN( AllTrim( cTexto ) )
Resistencia - "Ciudad de las Esculturas"
Chaco - Argentina
User avatar
Hernan Diego Ceccarelli
Posts: 84
Joined: Fri Oct 07, 2005 4:51 pm
Location: Rosario - Santa Fe - Argentina
Contact:

Re: Rutina numero a letras

Post by Hernan Diego Ceccarelli »

Que buena Funcion :mrgreen:
jbrita
Posts: 507
Joined: Mon Jan 16, 2006 3:42 pm

Re: Rutina numero a letras

Post by jbrita »

Hernan que bueno tenerte por aca

Saludos
jcaro
Posts: 270
Joined: Fri Nov 11, 2005 7:39 pm

Re: Rutina numero a letras

Post by jcaro »

Gracias MarioG, la vamos a mirar tambien.

Saludos,
JC
Juan
==> Pasando a FWH16.04 + Harbour32 + BCC70 + PellesC
=> Abandonando FWH 13.7 + xHarbour + BCC582
http://www.mitaller.cl
User avatar
MarioG
Posts: 1380
Joined: Fri Oct 14, 2005 1:28 pm
Location: Resistencia - Chaco - AR
Been thanked: 2 times

Re: Rutina numero a letras

Post by MarioG »

Buenísima funcion :mrgreen:
Saludos
Resistencia - "Ciudad de las Esculturas"
Chaco - Argentina
ARCC
Posts: 86
Joined: Sat Jun 24, 2006 4:27 pm
Location: Maracaibo - Zulia - Venezuela
Contact:

Re: Rutina numero a letras

Post 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 | Expand

//*******######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  EndIfReturn cCadena 
Saludos,

Antonio Castro
Maracaibo - Venezuela
ant_cas@yahoo.com
Post Reply