Rutina numero a letras
Rutina numero a letras
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
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
JC
Analiza este link
http://forums.fivetechsupport.com/viewtopic.php?f=6&t=16955&p=87963&hilit=literal#p87963
Saludos,
Adhemar
Analiza este link
http://forums.fivetechsupport.com/viewtopic.php?f=6&t=16955&p=87963&hilit=literal#p87963
Saludos,
Adhemar
Saludos,
Adhemar C.
Adhemar C.
- Jairo Barbosa
- Posts: 194
- Joined: Fri Jan 23, 2009 2:50 am
- Location: Cali Valle Colombia
- Contact:
Re: Rutina numero a letras
Muchas gracias Adhemar y Jairo por los link.
Hay bastante para analizar.
Saludos ,
JC
Hay bastante para analizar.
Saludos ,
JC
Juan
==> Pasando a FWH16.04 + Harbour32 + BCC70 + PellesC
=> Abandonando FWH 13.7 + xHarbour + BCC582
http://www.mitaller.cl
==> Pasando a FWH16.04 + Harbour32 + BCC70 + PellesC
=> Abandonando FWH 13.7 + xHarbour + BCC582
http://www.mitaller.cl
- MarioG
- Posts: 1380
- Joined: Fri Oct 14, 2005 1:28 pm
- Location: Resistencia - Chaco - AR
- Been thanked: 2 times
Re: Rutina numero a letras
JC;
De este foro bajé el siguiente código (aunque no recuerdo si de un post o de Utilidades)
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
Chaco - Argentina
- Hernan Diego Ceccarelli
- Posts: 84
- Joined: Fri Oct 07, 2005 4:51 pm
- Location: Rosario - Santa Fe - Argentina
- Contact:
Re: Rutina numero a letras
Gracias MarioG, la vamos a mirar tambien.
Saludos,
JC
Saludos,
JC
Juan
==> Pasando a FWH16.04 + Harbour32 + BCC70 + PellesC
=> Abandonando FWH 13.7 + xHarbour + BCC582
http://www.mitaller.cl
==> Pasando a FWH16.04 + Harbour32 + BCC70 + PellesC
=> Abandonando FWH 13.7 + xHarbour + BCC582
http://www.mitaller.cl
- MarioG
- Posts: 1380
- Joined: Fri Oct 14, 2005 1:28 pm
- Location: Resistencia - Chaco - AR
- Been thanked: 2 times
Re: Rutina numero a letras
Buenísima funcion
Saludos

Saludos
Resistencia - "Ciudad de las Esculturas"
Chaco - Argentina
Chaco - Argentina
Re: Rutina numero a letras
Buen día para todos...
Años sin postear!!!

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.
Años sin postear!!!



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