 |
Club Builder Foro de C++Builder en español
|
| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
Humberto Cdt

Registrado: 26 Ago 2002Mensajes: 12Ubicación: Barranquilla(Colombia)
|
Publicado: Mie 04 Feb, 2004 5:54 pm Asunto: Convertir numero a letras |
|
|
hola,
mi problema es el siguiente.
resulta que quiero convertir un numero entero a letras.
ej: 1520 return MIL QUINIENTOS VEINTE
Gracias por tu ayuda _________________ NINGUNO DE NOSOTROS ES TAN BUENO,
COMO TODOS NOSOTROS |
|
| Volver arriba |
|
 |
Cesar C. Salazar Gonzalez Master


Registrado: 01 Oct 2002Mensajes: 2155Ubicación: San Cristóbal de Las Casas, Chiapas
|
Publicado: Mie 04 Feb, 2004 7:04 pm Asunto: |
|
|
te mando una funcion que lo realiza, dentro de la pagina principal del foro exite una DLL, enviada por ZIC, (www.arrakis.es/~rporcar), para convertirla, pero a qui pongo un codigo, para hacerlo.., es un poco larga
la funcion se llama NoToLet(), y le pasas como parametro una cadena para representar el numero
Ejemplo
Label1->Capition = NoToLet("56342");
y este es el codigo fuente.. se pude mejorar.. y espero que me envies la respuesta
| Código: |
// Funcion que convierte un numero a su representacion en letras
// por Cesar Salazar Gonzalez.
char *NoToLet(const char *A){
const char *numero=A;
char Letras[140];
int p,l=0,des;
p=0;
Letras[0]='\0';
char N1='0',N2='0',N3='0';
int ancho=strlen(numero);
int ancho2=strlen(numero);
while(l<=ancho-1){
if(ancho2-3==0 || ancho2-6==0 || ancho2-9==0){
p=3;
des=3;
}
if(ancho2-3==-1 || ancho2-6==-1 || ancho2-9==-1){
p=2;
des=2;
}
if(ancho2-3==-2 || ancho2-6==-2 || ancho2-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'){
strcat(Letras," Cien ");
l+=2;
p-=2;
}else{
strcat(Letras," Ciento ");
l++;
p--;
}
break;
case '2':
strcat(Letras," Doscientos ");
l++;
p--;
break;
case '3':
strcat(Letras," Trescientos ");
l++;
p--;
break;
case '4':
strcat(Letras," Cuatroscientos ");
l++;
p--;
break;
case '5':
strcat(Letras," Quinientos ");
l++;
p--;
break;
case '6':
strcat(Letras," Seiscientos ");
l++;
p--;
break;
case '7':
strcat(Letras," Setecientos ");
l++;
p--;
break;
case '8':
strcat(Letras," Ochocientos ");
l++;
p--;
break;
case '9':
strcat(Letras," Novecientos ");
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':strcat(Letras," Once ");
break;
case '2':strcat(Letras," Doce ");
break;
case '3':strcat(Letras," Trece ");
break;
case '4':strcat(Letras," Catorce ");
break;
case '5':strcat(Letras," Quince ");
break;
case '6':strcat(Letras," Diesciseis ");
break;
case '7':strcat(Letras," Diescisiete ");
break;
case '8':strcat(Letras," Diesciocho ");
break;
case '9':strcat(Letras," Diescinueve ");
break;
}
}else{
strcat(Letras," Diez ");
}
l+=2;
p-=2;
break;
case '2':
if(N2!='0'){
strcat(Letras," Veinti");
l++;
p--;
}else{
strcat(Letras," Veinte ");
l+=2;
p-=2;
}
break;
case '3':if(N2!='0'){
strcat(Letras," Treinta y ");
l++;
p--;
}else{
strcat(Letras," Treinta ");
l+=2;
p-=2;
}
break;
case '4':if(N2!='0'){
strcat(Letras," Cuarenta y ");
l++;
p--;
}else{
strcat(Letras," Cuarenta ");
l+=2;
p-=2;
}
break;
case '5':if(N2!='0'){
strcat(Letras," Cincuenta y ");
l++;
p--;
}else{
strcat(Letras," Cincuenta ");
l+=2;
p-=2;
}
break;
case '6':if(N2!='0'){
strcat(Letras," Sesenta y ");
l++;
p--;
}else{
strcat(Letras," Sesenta ");
l+=2;
p-=2;
}
break;
case '7':if(N2!='0'){
strcat(Letras," Setenta y ");
l++;
p--;
}else{
strcat(Letras," Setenta ");
l+=2;
p-=2;
}
break;
case '8':if(N2!='0'){
strcat(Letras," Ochenta y ");
l++;
p--;
}else{
strcat(Letras," Ochenta ");
l+=2;
p-=2;
}
break;
case '9':if(N2!='0'){
strcat(Letras," Noventa y ");
l++;
p--;
}else{
strcat(Letras," Noventa ");
l+=2;
p-=2;
}
break;
}
}
///////////////////// numeros ordinarios.
if(p==1){
N1=numero[l];
switch(N1){
case '0':
break;
case '1':
strcat(Letras,"Uno ");
break;
case '2':strcat(Letras,"Dos ");
break;
case '3':strcat(Letras,"Tres ");
break;
case '4':strcat(Letras,"Cuatro ");
break;
case '5':strcat(Letras,"Cinco ");
break;
case '6':strcat(Letras,"Seis ");
break;
case '7':strcat(Letras,"Siete ");
break;
case '8':strcat(Letras,"Ocho ");
break;
case '9':strcat(Letras,"Nueve ");
break;
}
l++;
}
// miles
if(N1!='0'){
if(ancho2==11 || ancho2==12 || ancho2==10)
if (ancho2==7 && N1=='1')
strcpy(Letras," Un Billon ");
else
strcat(Letras," Billones ");
if(ancho2==8 || ancho2==9 || ancho2==7)
if (ancho2==7 && N1=='1')
strcpy(Letras," Un Mill¢n ");
else
strcat(Letras," Millones ");
if(ancho2==5 || ancho2==6 || ancho2==4)
if (ancho2==4 && N1=='1')
strcpy(Letras," Mil ");
else
strcat(Letras," Mil ");
}
ancho2-=des;
}
return(Letras);
} |
creo que que obientes Billones, o algo asi.. pero te da el nombre de una ciffra que contenga 12 digitos
Saludos _________________
 |
|
| Volver arriba |
|
 |
Humberto Cdt

Registrado: 26 Ago 2002Mensajes: 12Ubicación: Barranquilla(Colombia)
|
Publicado: Mie 04 Feb, 2004 7:32 pm Asunto: |
|
|
Voy a probarlo
Muchas Gracias. _________________ NINGUNO DE NOSOTROS ES TAN BUENO,
COMO TODOS NOSOTROS |
|
| Volver arriba |
|
 |
Cesar C. Salazar Gonzalez Master


Registrado: 01 Oct 2002Mensajes: 2155Ubicación: San Cristóbal de Las Casas, Chiapas
|
Publicado: Mie 04 Feb, 2004 7:37 pm Asunto: |
|
|
Espero que haya, funcionado, te habras dado cuenta.. que utliza funciones de antiguas como el strcat strcopy, etc. es que ya tiene un buen rato que la hice... _________________
 |
|
| Volver arriba |
|
 |
Humberto Cdt

Registrado: 26 Ago 2002Mensajes: 12Ubicación: Barranquilla(Colombia)
|
Publicado: Mie 04 Feb, 2004 8:51 pm Asunto: |
|
|
Gracias.
si me funcionó, aunque me toco hacerle unos cambios. de char a AnsiString _________________ NINGUNO DE NOSOTROS ES TAN BUENO,
COMO TODOS NOSOTROS |
|
| Volver arriba |
|
 |
Cesar C. Salazar Gonzalez Master


Registrado: 01 Oct 2002Mensajes: 2155Ubicación: San Cristóbal de Las Casas, Chiapas
|
Publicado: Mie 04 Feb, 2004 9:44 pm Asunto: |
|
|
Pues ahora pon el Codigo Mejorado.. para todos...
en esta parte del foro _________________
 |
|
| Volver arriba |
|
 |
Humberto Cdt

Registrado: 26 Ago 2002Mensajes: 12Ubicación: Barranquilla(Colombia)
|
Publicado: Jue 05 Feb, 2004 6:50 pm Asunto: |
|
|
AnsiString NoToLet(const char *A){
const char *numero=A;
AnsiString Letras;
int p,l=0,des;
p=0;
//Letras[0]='\0';
char N1='0',N2='0',N3='0';
int ancho=strlen(numero);
int ancho2=strlen(numero);
while(l<=ancho-1){
if(ancho2-3==0 || ancho2-6==0 || ancho2-9==0){
p=3;
des=3;
}
if(ancho2-3==-1 || ancho2-6==-1 || ancho2-9==-1){
p=2;
des=2;
}
if(ancho2-3==-2 || ancho2-6==-2 || ancho2-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= Letras + " Cien ";
l+=2;
p-=2;
}else{
Letras= Letras + " Ciento ";
l++;
p--;
}
break;
case '2':
Letras= Letras + " Doscientos ";
l++;
p--;
break;
case '3':
Letras= Letras + " Trescientos ";
l++;
p--;
break;
case '4':
Letras= Letras + " Cuatroscientos ";
l++;
p--;
break;
case '5':
Letras= Letras + " Quinientos ";
l++;
p--;
break;
case '6':
Letras= Letras + " Seiscientos ";
l++;
p--;
break;
case '7':
Letras= Letras + " Setecientos ";
l++;
p--;
break;
case '8':
Letras= Letras + " Ochocientos ";
l++;
p--;
break;
case '9':
Letras= Letras + " Novecientos ";
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= Letras + " Once ";
break;
case '2':Letras= Letras + " Doce ";
break;
case '3':Letras= Letras + " Trece ";
break;
case '4':Letras= Letras + " Catorce ";
break;
case '5':Letras= Letras + " Quince ";
break;
case '6':Letras= Letras + " Diesciseis ";
break;
case '7':Letras= Letras + " Diescisiete ";
break;
case '8':Letras= Letras + " Diesciocho ";
break;
case '9':Letras= Letras + " Diescinueve ";
break;
}
}else{
Letras= Letras + " Diez ";
}
l+=2;
p-=2;
break;
case '2':
if(N2!='0'){
Letras= Letras + " Veinti";
l++;
p--;
}else{
Letras= Letras + " Veinte ";
l+=2;
p-=2;
}
break;
case '3':if(N2!='0'){
Letras= Letras + " Treinta y ";
l++;
p--;
}else{
Letras= Letras + " Treinta ";
l+=2;
p-=2;
}
break;
case '4':if(N2!='0'){
Letras= Letras + " Cuarenta y ";
l++;
p--;
}else{
Letras= Letras + " Cuarenta ";
l+=2;
p-=2;
}
break;
case '5':if(N2!='0'){
Letras= Letras + " Cincuenta y ";
l++;
p--;
}else{
Letras= Letras + " Cincuenta ";
l+=2;
p-=2;
}
break;
case '6':if(N2!='0'){
Letras= Letras + " Sesenta y ";
l++;
p--;
}else{
Letras= Letras + " Sesenta ";
l+=2;
p-=2;
}
break;
case '7':if(N2!='0'){
Letras= Letras + " Setenta y ";
l++;
p--;
}else{
Letras= Letras + " Setenta ";
l+=2;
p-=2;
}
break;
case '8':if(N2!='0'){
Letras= Letras + " Ochenta y ";
l++;
p--;
}else{
Letras= Letras + " Ochenta ";
l+=2;
p-=2;
}
break;
case '9':if(N2!='0'){
Letras= Letras + " Noventa y ";
l++;
p--;
}else{
Letras= Letras + " Noventa ";
l+=2;
p-=2;
}
break;
}
}
///////////////////// numeros ordinarios.
if(p==1){
N1=numero[l];
switch(N1){
case '0':
break;
case '1':
Letras= Letras + "Uno ";
break;
case '2':Letras= Letras + "Dos ";
break;
case '3':Letras= Letras + "Tres ";
break;
case '4':Letras= Letras + "Cuatro ";
break;
case '5':Letras= Letras + "Cinco ";
break;
case '6':Letras= Letras + "Seis ";
break;
case '7':Letras= Letras + "Siete ";
break;
case '8':Letras= Letras + "Ocho ";
break;
case '9':Letras= Letras + "Nueve ";
break;
}
l++;
}
// miles
if(N1!='0'){
if(ancho2==11 || ancho2==12 || ancho2==10)
if (ancho2==7 && N1=='1')
Letras=" Un Billon ";
else
Letras= Letras + " Billones ";
if(ancho2==8 || ancho2==9 || ancho2==7)
if (ancho2==7 && N1=='1')
Letras= " Un Millon ";
else
Letras= Letras + " Millones ";
if(ancho2==5 || ancho2==6 || ancho2==4)
if (ancho2==4 && N1=='1')
Letras= " Mil ";
else
Letras= Letras + " Mil ";
}
ancho2-=des;
}
return(Letras);
} _________________ NINGUNO DE NOSOTROS ES TAN BUENO,
COMO TODOS NOSOTROS |
|
| Volver arriba |
|
 |
Cesar C. Salazar Gonzalez Master


Registrado: 01 Oct 2002Mensajes: 2155Ubicación: San Cristóbal de Las Casas, Chiapas
|
Publicado: Jue 05 Feb, 2004 7:02 pm Asunto: |
|
|
Bueno.. todo se puede mejorar.. je je _________________
 |
|
| Volver arriba |
|
 |
Fabalv Cdt


Registrado: 08 Ene 2004Mensajes: 23Ubicación: Autlán de Navarro, Jalisco, México
|
Publicado: Vie 06 Feb, 2004 2:56 am Asunto: |
|
|
| Código: |
AnsiString Left(AnsiString cad, int ind)
{
AnsiString ret;
int i;
if(ind>=cad.Length()) return ret;
for(i=1;i<=ind;i++)
{ ret+=cad[i];
}
return ret;
}
// Función para convertir los números a su nombre en español.
// por Fabián Everardo Alvarez Navarro
// Limitaciones: Solo puede convertir numeros enteros entre
// 0 y 999999 (inclusive)
AnsiString numeroConLetra(long numero,bool capital=false)
{
if(numero<0 || numero>999999) return AnsiString("");
char Nombres0[30][12]={ "",
"un",
"dos",
"tres",
"cuatro",
"cinco",
"seis",
"siete",
"ocho",
"nueve",
"diez",
"once",
"doce",
"trece",
"catorce",
"quince",
"dieciseis",
"diecisiete",
"dieciocho",
"diecinueve",
"veinte",
"veintiun",
"ventidos",
"ventitres",
"venticuatro",
"venticinco",
"ventiseis",
"ventisiete",
"ventiocho",
"ventinueve"
};
char Nombres1[10][10]={ "",
"diez",
"veinte",
"treinta",
"cuarenta",
"cincuenta",
"sesenta",
"setenta",
"ochenta",
"noventa"
};
char Nombres2[10][14]={ "",
"ciento",
"doscientos",
"trescientos",
"cuatrocientos",
"quinientos",
"seiscientos",
"setecientos",
"ochocientos",
"novecientos"
};
char NombresX[4][5]={ "cero",
"uno",
"cien",
"mil"
};
AnsiString AuxNum(numero), NumConLet, AuxStr;
int AuxLen=AuxNum.Length(), i, j, k=1;
for(i=AuxLen;i>0;i--,k++)
{ AuxStr=AuxNum.SubString(k,1);
j=AuxStr.ToInt();
if(AuxLen>1 && i<AuxLen)
NumConLet+=" ";
switch(i)
{ case 1: if(j==0)
{ if(i<AuxLen)//??Revisar...
NumConLet=Left(NumConLet,NumConLet.Length()-3); //Left(NumeroConLetra, Len(NumeroConLetra) - 3)
else
NumConLet=NombresX[0];
}
else
NumConLet+=Nombres0[j];
break;
case 2: switch(j)
{ case 0: case 1:
case 2: AuxStr=AuxNum.SubString(k,2);
j=AuxStr.ToInt();
k++; i--;
NumConLet+=Nombres0[j];
break;
case 3: case 4:
case 5: case 6:
case 7: case 8:
case 9: NumConLet+=Nombres1[j];
NumConLet+=" y";
break;
}
break;
case 3: AuxStr=AuxNum.SubString(k+1,2);
if(j==1 && AuxStr.ToInt()==0)
{ NumConLet+=NombresX[2];
i-=2; k+=2;
}
else NumConLet+=Nombres2[j];
break;
case 4: if(j== 0)
NumConLet=Left(NumConLet,NumConLet.Length()-3);// Left(NumeroConLetra, Len(NumeroConLetra) - 3)
else{ NumConLet+=Nombres0[j];
NumConLet+=" ";
NumConLet+=NombresX[3];
}
break;
case 5: switch(j)
{ case 0: case 1:
case 2: AuxStr=AuxNum.SubString(k,2);
j=AuxStr.ToInt();
k++; i--;
NumConLet+=Nombres0[j];
NumConLet+=" ";
NumConLet+=NombresX[3];
break;
case 3: case 4:
case 5: case 6:
case 7: case 8:
case 9: NumConLet+=Nombres1[j];
NumConLet+=" y";
break;
}
break;
case 6: AuxStr=AuxNum.SubString(k+1,2);
if(j==1 && AuxStr.ToInt()==0)
{ NumConLet+=NombresX[2];
NumConLet+=" ";
NumConLet+=NombresX[3];
i-=2; k+=2;
}
else NumConLet+=Nombres2[j];
break;
}
}
if(capital==true)
{ NumConLet[1]=toupper(NumConLet[1]);
}
return NumConLet;
}
|
Esta la hice ya hace tiempo, si alguien la mejora, por favor publiquenla.
Ademas, si lo van a utilizar, no estaria mal que me avisen. (el ego es grande) _________________ Mientras mas errores cometa hoy, menos me equivocaré mañana. |
|
| Volver arriba |
|
 |
Angel Master


Registrado: 15 Abr 2003Mensajes: 2311Ubicación: Toledo (España)
|
|
| Volver arriba |
|
 |
rockman Ens

Registrado: 13 Mar 2004Mensajes: 44
|
Publicado: Jue 23 Ago, 2007 6:36 pm Asunto: |
|
|
Buenas,
Estoy utilizando el codigo de Favalv y me he dado cuenta de un error cuando la cifra es redonda (40000,50000,...)
Os paso el codigo corregido
| Código: |
AnsiString EnteroConLetra(long numero)
{
if(numero<0>999999) return AnsiString("");
char Nombres0[30][12]={ "",
"un",
"dos",
"tres",
"cuatro",
"cinco",
"seis",
"siete",
"ocho",
"nueve",
"diez",
"once",
"doce",
"trece",
"catorce",
"quince",
"dieciseis",
"diecisiete",
"dieciocho",
"diecinueve",
"veinte",
"veintiun",
"ventidos",
"ventitres",
"venticuatro",
"venticinco",
"ventiseis",
"ventisiete",
"ventiocho",
"ventinueve"
};
char Nombres1[10][10]={ "",
"diez",
"veinte",
"treinta",
"cuarenta",
"cincuenta",
"sesenta",
"setenta",
"ochenta",
"noventa"
};
char Nombres2[10][14]={ "",
"ciento",
"doscientos",
"trescientos",
"cuatrocientos",
"quinientos",
"seiscientos",
"setecientos",
"ochocientos",
"novecientos"
};
char NombresX[4][5]={ "cero",
"uno",
"cien",
"mil"
};
AnsiString AuxNum(numero), NumConLet, AuxStr;
int AuxLen=AuxNum.Length(), i, j, k=1;
for(i=AuxLen;i>0;i--,k++)
{
AuxStr=AuxNum.SubString(k,1);
j=AuxStr.ToInt();
if(AuxLen>1 && i<AuxLen)
NumConLet+=" ";
switch(i)
{
case 1:
if(j==0)
{
if(i<AuxLen)
NumConLet=NumConLet.SubString(1,NumConLet.Length()-3); //Left(NumeroConLetra, Len(NumeroConLetra) - 3)
else
NumConLet=NombresX[0];
}
else
NumConLet+=Nombres0[j];
break;
case 2:
switch(j)
{
case 0: case 1: case 2:
AuxStr=AuxNum.SubString(k,2);
j=AuxStr.ToInt();
k++; i--;
NumConLet+=Nombres0[j];
break;
case 3: case 4: case 5: case 6: case 7: case 8: case 9:
NumConLet+=Nombres1[j];
NumConLet+=" y";
break;
}
break;
case 3:
AuxStr=AuxNum.SubString(k+1,2);
if(j==1 && AuxStr.ToInt()==0)
{
NumConLet+=NombresX[2];
i-=2; k+=2;
}
else
NumConLet+=Nombres2[j];
break;
case 4:
if(j== 0)
NumConLet=NumConLet.SubString(1,NumConLet.Length()-2);
else
{
if (j!=1)
{
NumConLet+=Nombres0[j];
NumConLet+=" ";
}
}
NumConLet+=NombresX[3];
break;
case 5:
switch(j)
{
case 0: case 1: case 2:
AuxStr=AuxNum.SubString(k,2);
j=AuxStr.ToInt();
k++; i--;
NumConLet+=Nombres0[j];
NumConLet+=" ";
NumConLet+=NombresX[3];
break;
case 3: case 4: case 5: case 6: case 7: case 8: case 9:
NumConLet+=Nombres1[j];
NumConLet+=" y";
break;
}
break;
case 6:
AuxStr=AuxNum.SubString(k+1,2);
if(j==1 && AuxStr.ToInt()==0)
{
NumConLet+=NombresX[2];
NumConLet+=" ";
NumConLet+=NombresX[3];
i-=2; k+=2;
}
else
NumConLet+=Nombres2[j];
break;
}
}
return NumConLet;
}
|
|
|
| Volver arriba |
|
 |
Cesar C. Salazar Gonzalez Master


Registrado: 01 Oct 2002Mensajes: 2155Ubicación: San Cristóbal de Las Casas, Chiapas
|
Publicado: Jue 23 Ago, 2007 8:29 pm Asunto: |
|
|
existen varias versiones, checa cual te sirve aun que la que he puesto funciona sin ningun problema _________________
 |
|
| Volver arriba |
|
 |
Streetracer Cdt

Registrado: 03 Nov 2009Mensajes: 3Ubicación: Cuernavaca
|
Publicado: Mar 03 Nov, 2009 10:07 am Asunto: |
|
|
Hola.. Una pregunta que puede estar mal con esta parte del codigo
AnsiString Notolet(const char *A){
ya que marca error y dice que la declaracion es incorrecta _________________ The best of the lost arts |
|
| Volver arriba |
|
 |
|
|
No puedes publicar temas nuevos en este foro No puedes responder a temas en este foro No puedes editar tus mensajes en este foro No puedes borrar tus mensajes en este foro No puedes votar en las encuestas de este foro
|
© 2002–2026 Club Builder · Funciona con phpBB.
|