PDA

Ver la Versión Completa : Dudas al convertir numero en letra y centavos


rufo
20-11-2009, 21:01:32
Hola amigos tengo un dilema resulta que quiero pasar una cantidad numerica a letras por ejemplo $12.50 Doce con cincuenta centavos, ya pude hacer que me aparesca la cifra con letra pero ahora resulta que no veo la forma para que aparesca la palabra centavos cuando halla centavos en la cifra les anexo mi codigo que estoy usando.


function Deletrear(numero: real) : string; var
letras: TLetras;
begin
letras := TLetras.Create(nil);
try
letras.Numero := numero;
Result := letras.AsString;
finally
letras.Free;
end;
end;

procedure TAlta_factura.Button3Click(Sender: TObject);
var
n: String;
begin
n:= Deletrear(StrToFloat(Edit10.Text) );
label5.Caption:= (n);
end;


Les comento que este codigo lo agarre de aqui del foro pero quiero que me aparescan la palabra centavos, bueno espero que me ayuden y gracias de antemano.

rgstuamigo
20-11-2009, 23:16:26
¿Que es realmente lo que deseas hacer?
¿Covertir un numero al tipo de dato String?
Ejemplo de Float->12.50 a '12,50'<--String
¿Convertir un numero a Literal?
Ejemplo Float->12.50 a 'Doce con 50' <--Literal

Cual de las dos cosas?:confused:.
Saludos..:)

rufo
20-11-2009, 23:29:18
Gracias por responder rgstuamigo lo que en si yo quiero es similar a esto
12.50 a Doce con cincuenta centavos en si eso es lo que quiero. obtener son los centavos en letra.

rgstuamigo
23-11-2009, 14:08:14
Gracias por responder rgstuamigo lo que en si yo quiero es similar a esto
12.50 a Doce con cincuenta centavos en si eso es lo que quiero. obtener son los centavos en letra.
En el club existia un truco que hace lo que pretendes,pero no he podido encontrarlo,tal parece que se ha perdido:o.
De todas formas en internet vas a encontrar miles de referencias de como hacerlo o componentes que ya te hacen eso por ejemplo(aqui (http://cc.embarcadero.com/Item/26929),aqui (http://www.todoexpertos.com/categorias/ciencias-e-ingenieria/matematicas/respuestas/449586/convertir-numeros-a-letras),aqui (http://www.terra.es/personal/alksoft/delphi/trucos/trucos.htm#NUMEROS),etc);).
Saludos...:)

marcoszorrilla
23-11-2009, 14:59:44
Mírate esta función, creo que es la que mencionas que había en el Club:

function IntToLetras(Numeros:Double):String;

function xIntToLetras(Valor:LongInt):String;
const
aUnidad : array[1..15] of String =
('UN','DOS','TRES','CUATRO','CINCO','SEIS',
'SIETE','OCHO','NUEVE','DIEZ','ONCE','DOCE',
'TRECE','CATORCE','QUINCE');
aCentena: array[1..9] of String =
('CIENTO','DOSCIENTOS','TRESCIENTOS',
'CUATROCIENTOS','QUINIENTOS','SEISCIENTOS',
'SETECIENTOS','OCHOCIENTOS','NOVECIENTOS');
aDecena : array[1..9] of String =
('DIECI','VEINTI','TREINTA','CUARENTA','CINCUENTA',
'SESENTA','SETENTA','OCHENTA','NOVENTA');
var
Centena, Decena, Unidad, Doble: LongInt;
Linea: String;
begin
if valor=100 then Linea:=' CIEN '
else begin
Linea:='';
Centena := Valor div 100;
Doble := Valor - (Centena*100);
Decena := (Valor div 10) - (Centena*10);
Unidad := Valor - (Decena*10) - (Centena*100);

if Centena>0 then Linea := Linea + Acentena[centena]+' ';

if Doble>0 then begin
if Doble=20 then Linea := Linea +' VEINTE '
else begin
if doble<16 then Linea := Linea + aUnidad[Doble]
else begin
Linea := Linea +' '+ Adecena[Decena];
if (Decena>2) and (Unidad<>0) then Linea := Linea+' Y ';
if Unidad>0 then Linea := Linea + aUnidad[Unidad];
end;
end;
end;
end;
Result := Linea;
end;

var
Millones,Miles,Unidades,numero: Longint;
Linea : String;
entero,decimal:variant;
n1,n2:Double;

begin
entero:=Int(numeros);
decimal:=Abs(frac(numeros) * 100);
numero:=entero;
{Inicializamos el string que contendrá las letras según el valor
numérico}
if numero=0 then
Linea := 'CERO'
else if numero<0 then Linea := 'MENOS '
else if numero=1 then
begin
Linea := 'UN';
//exit
end
else if numero>1 then Linea := '';

{Determinamos el Nº de millones, miles y unidades de numero en
positivo}
Numero := Abs(Numero);
Millones := numero div 1000000;
Miles := (numero - (Millones*1000000)) div 1000;
Unidades := numero - ((Millones*1000000)+(Miles*1000));

{Vamos poniendo en el string las cadenas de los números(llamando
a subfuncion)}
if Millones=1 then Linea:= Linea + ' UN MILLON '
else if Millones>1 then Linea := Linea + xIntToLetras(Millones)
+ ' MILLONES ';

if Miles =1 then Linea:= Linea + ' MIL '
else if Miles>1 then Linea := Linea + xIntToLetras(Miles)+
' MIL ';

if Unidades >0 then
Linea := Linea + xIntToLetras(Unidades);

//Nuevo para decimales
numero:=decimal;
Linea:=Linea +' Euros';

if numero > 0 then
begin
Linea:=Linea +' y ';

if numero=1 then
begin
Linea :=Linea + 'UN';
end
else if numero>1 then Linea := Linea+'';

{Determinamos el Nº de millones, miles y unidades de numero en
positivo}
Numero := Abs(Numero);
Millones := numero div 1000000;
Miles := (numero - (Millones*1000000)) div 1000;
Unidades := numero - ((Millones*1000000)+(Miles*1000));

{Vamos poniendo en el string las cadenas de los números(llamando
a subfuncion)}
if Millones=1 then Linea:= Linea + ' UN MILLON '
else if Millones>1 then Linea := Linea + xIntToLetras(Millones)
+ ' MILLONES ';

if Miles =1 then Linea:= Linea + ' MIL '
else if Miles>1 then Linea := Linea + xIntToLetras(Miles)+
' MIL ';

if Unidades >0 then
Linea := Linea + xIntToLetras(Unidades);

linea:=Linea+' cents';
end;

IntToletras:=Linea;
end;


Un Saludo.

dao_ar
23-11-2009, 15:11:06
Rufo he usado ese codigo y me tome el atrevimiento de agregarle una modificacion al mismo ( no pedi permiso al autor lo cual es incorrecto y voy a corregir esa situacion) para que escriba los centavos de la siguiente forma,
166.23
ciento ........ con veintitres ctvos
o
ciento ........ con 23/100

si te sirve enviame un correo a la direccion dao_ ar@yahoo. com y te lo envio.

marcoszorrilla
23-11-2009, 15:21:37
He incluido espacios en la dirección de correo para evitar que sea capturado por los especialistas del correo basura, por otra parte es de obligado cumplimiento en estos foros, publicar cualquier modificación o ampliación de código para que todo el mundo pueda disfrutar de los posibles beneficios de dichas modificaciones, por lo tanto no debe de contestarse a cuestiones de interés general por medio del correo privado, sino utilizando los foros que brindan su espacio para estos menesteres.

Gracias por vuestra comprensión.

Nota de Moderación.

Un Saludo.

dao_ar
23-11-2009, 16:15:47
Le envie el codigo a su autor el Sr. Carlos Garcia Trujillo (cgar1136@yahoo.com) para que valore las modificaciones y lo publique si lo desea.

Atte
Daniel

rufo
23-11-2009, 20:50:33
Gracias amigos por sus respuestas pero sigo igual ando un poco atolondrado en esto ya que puse el codigo que me anexaron en mi pregunta pero no sale si me pudieran decir que onda con el codigo por que lo pongo tal y como es pero me marca error, si no es mucho pedir me pueden decir como ponerlo y como llamarlo y gracias de antemano.

marcoszorrilla
23-11-2009, 22:23:28
Ejemplo de uso:


var
sLentras:String;
begin
//Con un Campo
sLetras:=IntToletras(Dmxxxx.FacturaTotal.value));
//con un número
sLetras:=IntToLetras(4500.33);



Un Saludo.

rufo
24-11-2009, 00:16:46
Gracias amigo marcoszorrilla pero ya tengo un codigo que es este


Function CantidadEnLetra(curCantidad: Currency; MonNal: integer): String;
var i: integer;
Cantidad, Centavos: Currency;
BloqueCero, NumeroBloques, Digito: Byte;
PrimerDigito, SegundoDigito, TercerDigito: Byte;
Resultado, Temp, strCentavos, Bloque: String;
Unidades: Array[0..28] of String;
Decenas: Array[0..8] of String;
Centenas: Array[0..8] of String;
begin

Unidades[0] := 'UN'; Unidades[1] := 'DOS'; Unidades[2] := 'TRES'; Unidades[3] := 'CUATRO';
Unidades[4] := 'CINCO'; Unidades[5] := 'SEIS'; Unidades[6] := 'SIETE'; Unidades[7] := 'OCHO';
Unidades[8] := 'NUEVE'; Unidades[9] := 'DIEZ'; Unidades[10] := 'ONCE'; Unidades[11] := 'DOCE';
Unidades[12] := 'TRECE'; Unidades[13] := 'CATORCE'; Unidades[14] := 'QUINCE'; Unidades[15] := 'DIECISÉIS';
Unidades[16] := 'DIECISIETE'; Unidades[17] := 'DIECIOCHO'; Unidades[18] := 'DIECINUEVE';
Unidades[19] := 'VEINTE'; Unidades[20] := 'VEINTIUNO'; Unidades[21] := 'VEINTIDÓS';
Unidades[22] := 'VEINTITRÉS'; Unidades[23] := 'VEINTICUATRO'; Unidades[24] := 'VEINTICINCO';
Unidades[25] := 'VEINTISÉIS'; Unidades[26] := 'VEINTISIETE'; Unidades[27] := 'VEINTIOCHO'; Unidades[28] := 'VEINTINUEVE';

Decenas[0] := 'DIEZ'; Decenas[1] := 'VEINTE'; Decenas[2] := 'TREINTA'; Decenas[3] := 'CUARENTA';
Decenas[4] := 'CINCUENTA'; Decenas[5] := 'SESENTA'; Decenas[6] := 'SETENTA'; Decenas[7] := 'OCHENTA'; Decenas[8] := 'NOVENTA';

Centenas[0] := 'CIENTO'; Centenas[1] := 'DOSCIENTOS'; Centenas[2] := 'TRESCIENTOS'; Centenas[3] := 'CUATROCIENTOS';
Centenas[4] := 'QUINIENTOS'; Centenas[5] := 'SEISCIENTOS'; Centenas[6] := 'SETECIENTOS'; Centenas[7] := 'OCHOCIENTOS'; Centenas[8] := 'NOVECIENTOS';

Cantidad := Trunc(curCantidad);
Centavos := (curCantidad - Cantidad) * 100;
NumeroBloques := 1;
Repeat
PrimerDigito := 0;
SegundoDigito := 0;
TercerDigito := 0;
Bloque := '';
BloqueCero := 0;
For i := 1 To 3 do begin
Digito := Round(Cantidad) Mod 10;
If Digito <> 0 Then begin
Case i of
1: begin
Bloque := ' ' + Unidades[Digito - 1];
PrimerDigito := Digito;
end; //case 1
2: begin
If Digito <= 2 Then begin
Bloque := ' ' + Unidades[(Digito * 10 + PrimerDigito - 1)];
end Else begin
If PrimerDigito <> 0 then
Temp := ' Y' else Temp := '';
Bloque := ' ' + Decenas[Digito - 1] + Temp + Bloque;
End; //if
SegundoDigito := Digito;
end; //case 2
3: begin
If (Digito = 1) and (PrimerDigito = 0) and (SegundoDigito = 0) then
Temp := 'CIEN' else Temp := Centenas[Digito-1];
Bloque := ' ' + Temp + Bloque;
TercerDigito := Digito;
end; //case 3
End; //case
end Else begin
BloqueCero := BloqueCero + 1;
End; // If Digito <>0
Cantidad := Int(Cantidad / 10);
If Cantidad = 0 Then begin
Break;
End; // If Cantidad=0
end; //for
Case NumeroBloques of
1:
Resultado := Bloque;
2: begin
if BloqueCero = 3 then
Temp := '' else Temp := ' MIL';
Resultado := Bloque + Temp + Resultado;
end; //case 2
3: begin
If (PrimerDigito = 1) and (SegundoDigito = 0) and (TercerDigito = 0) then
Temp := ' MILLON' else Temp := ' MILLONES';
Resultado := Bloque + Temp + Resultado;
end; //case 3
End; //case
NumeroBloques := NumeroBloques + 1;
Until Cantidad = 0; //repeat
case MonNal of
0: begin
If curCantidad > 1 then
Temp := ' CENTAVOS ***' else Temp := ' CENTAVO ***';
CantidadEnLetra := Resultado + Temp;

end;
1: begin
If curCantidad > 1 then
Temp := ' PESOS ' else Temp := ' PESO ';
if Centavos=0 then strCentavos := '' else strCentavos := 'CON '+CantidadEnLetra(Centavos, 0);
CantidadEnLetra := 'SON: *** ' + Resultado + Temp + strCentavos;
end;
2: begin
If curCantidad > 1 then
Temp := ' DLLS ' else Temp := ' DOLAR ';
if Centavos=0 then strCentavos := '' else strCentavos := 'CON '+CantidadEnLetra(Centavos, 0);
CantidadEnLetra := 'SON: *** ' + Resultado + Temp + strCentavos;
end;
end;

End;


Este codigo es del amigo Contraveneno fue el que encontre todo marcha bien pero ahora como le hago para ejecutar esta funcion quiero decir que codigo le pongo en el objeto de un boton ya que cuando le de clic me convierta la cantidad en letra, ya que puse este codigo en el boton pero me marcar error


var
i: string;
begin
i:= CantidadEnLetra(StrToFloat(Edit1.Text) );
label1.Caption:= (i);
end;


Entonces nose que este haciendo mal, espero que me auxilien ya que llevo dias con esto y gracias de nuevo.

krlox31416
26-11-2009, 13:12:04
Seguramente te marca error porque en tu edit estas capturando 123.50 en vez de 123,50 por eso te marca el error si capturas una cantidad manualmente como 123,50 veras que la función de contraveneno funciona y eso te lo aseguro porque yo tambien use su función pero no me acordaba que hay que convertir el punto decimal a coma para que muestre los centavos si no quieres hacer uso de la funcion strFormatDecimal validar que solo te permita capturar coma en vez de punto decimal

esta función lo que hece es convertir el punto decimal a coma


Function strFormatDecimal(strNum: String): String; // FUNCIÓN PARA AGREGAR UNA COMA Y EVITAR EL ERROR DE EXCEPCION
begin
if (AnsiPos('.', strNum) <> 0) then
strNum := Copy(strNum, 0, AnsiPos('.', strNum)-1) + ',' +
Copy(strNum, AnsiPos('.', strNum) + 1, Length(strNum)-AnsiPos('.', strNum));
if strNum = '' then strNum := '0';
strFormatDecimal := strNum;
end;


asi la llamas


Edit2.Text:= strFormatDecimal(Edit1.Text);
valor:= StrToFloat(Edit2.Text)////////donde valor es de tipo extended
Edit3.Text:= FloatToStr(valor);


y luego llamar la función CantidadEnLetra


var
i: integer; // para el case
begin
i:=1;
Edit4.Text:=CantidadEnLetra(StrToFloat(Edit3.Text),i);
end;



o tu problema es ese o estas haciendo mal uso de los datos porque si es eso deberias analizar lo que hace el codigo...
saludos!!!

rufo
26-11-2009, 16:35:34
Gracias amigos ya quedo listo.

krlox31416
27-11-2009, 06:11:29
por pura curiosidad que era lo que estabas haciendo mal que no te arrojaba el resultado?

saludos.

rufo
27-11-2009, 22:26:26
ok amigos les voy aponer mi codigo ya funcionando del cual les agradesco mucho sus contestaciones.


procedure TAlta_factura.Button1Click(Sender: TObject);
var
no1,no2:double;
no3,no4:real;
begin
if (edit4.text='')then
edit4.Text:='0';
if edit6.text='' then
edit6.Text:='0';
no1:=strtofloat(edit4.Text);
no2:=strtofloat(edit6.Text);
edit7.Text:=formatfloat('0.00',no1+no2);

no3:=strtofloat(edit10.Text);
edit8.text:=formatfloat('0.00',no3/1.15);
no4:=strtofloat(edit8.Text);
edit9.Text:=formatfloat('0.00',no4*0.15);
label5.Caption:=CantidadEnLetra(StrtoFloat(edit10.Text),1);
end;


La funcion es la que puse aqui en mi pregunta y de nuevo gracias.