29
« en: Sábado 22 de Julio de 2006, 15:59 »
Aqui les dejo uno que funciona a la perfección.
//---------------------------------------------------------------------------
// Funcion que convierte un numero a su representacion en letras
// por Cesar Salazar Gonzalez.
// Nota, en Mexico/LatinoAmerica, utilizamos la coma para separar miles.
// ejemplo mil quinientas pesetas con 20 centavos, se representa asi
// 1,500.20 <-Formato mexico
// 1.500,20 <-Formato español
// manera de usarla
// AnsiString Cadena = NoToLet("12335.56);
AnsiString __fastcall NoToLet(AnsiString CANTIDAD)
{
AnsiString NUEVA_CANTIDAD,NUMERO,DECIMALES,LETRAS="";
// PARA LIMPIAR LAS COMAS..,en formato Mex..
NUEVA_CANTIDAD="";
for(int ad=1;ad<=CANTIDAD.Length();ad++)
if(CANTIDAD[ad]!=',')
NUEVA_CANTIDAD += CANTIDAD[ad];
//extraer la parte Entera, cuando es ".", en Formato Mex
// cambiar a "," cuando sea español
if( NUEVA_CANTIDAD.Pos(".")> 0 ){
NUMERO = NUEVA_CANTIDAD.SubString(1,NUEVA_CANTIDAD.Pos(".")-1);
DECIMALES =" "+NUEVA_CANTIDAD.SubString( NUEVA_CANTIDAD.Pos(".")+1,2)+"/100 M.N";
}else{
NUMERO= NUEVA_CANTIDAD;
DECIMALES = ". 00/100 M.N.";
}
int p=1,l=1,des;
int LARGO,LARGO2;
// char N1='0',N2='0',N3='0';
char N1,N2,N3;
LARGO=NUMERO.Length();
LARGO2=NUMERO.Length();
while(l<=LARGO-1){
if(LARGO2-3==0 || LARGO2-6==0 || LARGO2-9==0){
p=3;
des=3;
}
if(LARGO2-3==-1 || LARGO2-6==-1 || LARGO2-9==-1){
p=2;
des=2;
}
if(LARGO2-3==-2 || LARGO2-6==-2 || LARGO2-9==-2){
p=1;
des=1;
}
///////////////////// numeros de Cienes.
if(p==3){
N1=NUMERO[l];
N2=NUMERO[l+1];
N3=NUMERO[l+2];
switch(N1){
case '0':
l++;
p--;
break;
case '1':
if(N2=='0' && N3=='0'){
LETRAS.Insert(" CIEN ",LETRAS.Length()+1);
l+=2;
p-=2;
}else{
LETRAS.Insert(" CIENTO ",LETRAS.Length()+1);
l++;
p--;
}
break;
case '2':
LETRAS.Insert(" DOSCIENTOS ",LETRAS.Length()+1);
l++;
p--;
break;
case '3':
LETRAS.Insert(" TRESCIENTOS ",LETRAS.Length()+1);
l++;
p--;
break;
case '4':
LETRAS.Insert(" CUATROCIENTOS ",LETRAS.Length()+1);
l++;
p--;
break;
case '5':
LETRAS.Insert(" QUINIENTOS ",LETRAS.Length()+1);
l++;
p--;
break;
case '6':
LETRAS.Insert(" SEISCIENTOS ",LETRAS.Length()+1);
l++;
p--;
break;
case '7':
LETRAS.Insert(" SETECIENTOS ",LETRAS.Length()+1);
l++;
p--;
break;
case '8':
LETRAS.Insert(" OCHOCIENTOS ",LETRAS.Length()+1);
l++;
p--;
break;
case '9':
LETRAS.Insert(" NOVECIENTOS ",LETRAS.Length()+1);
l++;
p--;
break;
}
}
///////////////////// numeros de decenas.
if(p==2){
N1=NUMERO[l];
N2=NUMERO[l+1];
switch(N1){
case '0':
l++;
p--;
break;
case '1':
if(N2!='0'){
switch(N2){
case '1':
LETRAS.Insert(" ONCE ",LETRAS.Length()+1);
break;
case '2':
LETRAS.Insert(" DOCE ",LETRAS.Length()+1);
break;
case '3':
LETRAS.Insert(" TRECE ",LETRAS.Length()+1);
break;
case '4':
LETRAS.Insert(" CATORCE ",LETRAS.Length()+1);
break;
case '5':
LETRAS.Insert(" QUINCE ",LETRAS.Length()+1);
break;
case '6':
LETRAS.Insert(" DIECISEIS ",LETRAS.Length()+1);
break;
case '7':
LETRAS.Insert(" DIECISIETE ",LETRAS.Length()+1);
break;
case '8':
LETRAS.Insert(" DIECIOCHO ",LETRAS.Length()+1);
break;
case '9':
LETRAS.Insert(" DIECINUEVE ",LETRAS.Length()+1);
break;
}
}else{
LETRAS.Insert(" DIEZ ",LETRAS.Length()+1);
}
l+=2;
p-=2;
break;
case '2':
if(N2!='0'){
LETRAS.Insert(" VEINTI",LETRAS.Length()+1);
l++;
p--;
}else{
LETRAS.Insert(" VEINTE ",LETRAS.Length()+1);
l+=2;
p-=2;
}
break;
case '3':if(N2!='0'){
LETRAS.Insert(" TREINTA Y ",LETRAS.Length()+1);
l++;
p--;
}else{
LETRAS.Insert(" TREINTA ",LETRAS.Length()+1);
l+=2;
p-=2;
}
break;
case '4':if(N2!='0'){
LETRAS.Insert(" CUARENTA Y ",LETRAS.Length()+1);
l++;
p--;
}else{
LETRAS.Insert(" CUARENTA ",LETRAS.Length()+1);
l+=2;
p-=2;
}
break;
case '5':if(N2!='0'){
LETRAS.Insert(" CINCUENTA Y ",LETRAS.Length()+1);
l++;
p--;
}else{
LETRAS.Insert(" CINCUENTA ",LETRAS.Length()+1);
l+=2;
p-=2;
}
break;
case '6':if(N2!='0'){
LETRAS.Insert(" SESENTA Y ",LETRAS.Length()+1);
l++;
p--;
}else{
LETRAS.Insert(" SESENTA ",LETRAS.Length()+1);
l+=2;
p-=2;
}
break;
case '7':if(N2!='0'){
LETRAS.Insert(" SETENTA Y ",LETRAS.Length()+1);
l++;
p--;
}else{
LETRAS.Insert(" SETENTA ",LETRAS.Length()+1);
l+=2;
p-=2;
}
break;
case '8':if(N2!='0'){
LETRAS.Insert(" OCHENTA Y ",LETRAS.Length()+1);
l++;
p--;
}else{
LETRAS.Insert(" OCHENTA ",LETRAS.Length()+1);
l+=2;
p-=2;
}
break;
case '9':if(N2!='0'){
LETRAS.Insert(" NOVENTA Y ",LETRAS.Length()+1);
l++;
p--;
}else{
LETRAS.Insert(" NOVENTA ",LETRAS.Length()+1);
l+=2;
p-=2;
}
break;
}
}
///////////////////// numeros ordinarios.
if(p==1){
N1=NUMERO[l];
switch(N1){
case '0':
break;
case '1':
LETRAS.Insert("UNO ",LETRAS.Length()+1);
break;
case '2':
LETRAS.Insert("DOS ",LETRAS.Length()+1);
break;
case '3':
LETRAS.Insert("TRES ",LETRAS.Length()+1);
break;
case '4':
LETRAS.Insert("CUATRO ",LETRAS.Length()+1);
break;
case '5':
LETRAS.Insert("CINCO ",LETRAS.Length()+1);
break;
case '6':
LETRAS.Insert("SEIS ",LETRAS.Length()+1);
break;
case '7':
LETRAS.Insert("SIETE ",LETRAS.Length()+1);
break;
case '8':
LETRAS.Insert("OCHO ",LETRAS.Length()+1);
break;
case '9':
LETRAS.Insert("NUEVE ",LETRAS.Length()+1);
break;
}
l++;
}
// miles
if(N1!='0'){
// en esta parte se pude insertar mas formatos
// aun que creo que con billones es suficiente.
if(LARGO2==11 || LARGO2==12 || LARGO2==10)
if (LARGO2==7 && N1=='1')
LETRAS =" UN BILLON ";
else
LETRAS.Insert(" BILLONES ",LETRAS.Length()+1);
if(LARGO2==8 || LARGO2==9 || LARGO2==7)
if (LARGO2==7 && N1=='1')
LETRAS = " UN MILLON " ;
else
LETRAS.Insert(" MILLONES ",LETRAS.Length()+1);
if(LARGO2==5 || LARGO2==6 || LARGO2==4)
if (LARGO2==4 && N1=='1')
LETRAS = " MIL ";
else
LETRAS.Insert(" MIL ",LETRAS.Length()+1);
}
LARGO2-=des;
}
return "("+(LETRAS+"PESOS "+DECIMALES)+")";
}