PDA

Ver la Versión Completa : Cambiar numeros a cantidad con letra


odrack
21-05-2008, 17:44:48
Saludos.

Quiza ya se haya hablado varias veces de este tema pero tengo un pequeño problema que me esta dando dolor de cabeza, tengo este codigo (mostrado en la parte de abajo) el cual esta funcionando correctamente hasta 999,999.99, tengo la necesidad de ampliarlo hasta 9 millones lo cual he tenido algunos problemas para esto. Cuando lo ejecuto marca el siguiente error "EconvertError with message".
Alguien me puede ayudar con esto, se los agradeceria mucho.

Tal y como esta hasta el momento funciona hasta 999,999.99, cuando quito la parte comentada en el codigo produce el error.


unit Extens;
interface
function extenso (valor: real): string;
implementation
uses
SysUtils, Dialogs;
function extenso (valor: real): string;
var
Centavos, Centena, Millar, Millon,Texto, msg: string;
const
Unidades: array[1..9] of string = ('Un','Dos', 'Tres', 'Cuatro', 'Cinco',
'Seis', 'Siete', 'Ocho', 'Nueve');
Diez: array[1..9] of string = ('Once', 'Doce', 'Trece', 'Catorce', 'Quince',
'Dieciseis', 'Diecisiete', 'Dieciocho', 'Diecinueve');
Decenas: array[1..9] of string = ('Diez', 'Veinte', 'Treinta', 'Cuarenta',
'Cincuenta', 'Sesenta', 'Setenta',
'Ochenta', 'Noventa');
Centenas: array[1..9] of string = ('Ciento', 'Doscientos', 'Trescientos',
'Cuatrocientos', 'Quinientos', 'Seiscientos',
'Setecientos', 'Ochocientos', 'Novecientos');
Millones: array[1..9] of string = ('Un ','Dos ', 'Tres ', 'Cuatro ', 'Cinco ',
'Seis ', 'Siete ', 'Ocho ', 'Nueve ');
function ifs(Expresado: Boolean; CasoVerdadero, CasoFalso: String): String;
begin
if Expresado then
Result:=CasoVerdadero
else
Result:=CasoFalso;
end;
function MiniExtenso (tres: string): string;
var
Unidad, Decena, Centena, Millones: string;
begin
Unidad:='';
Decena:='';
Centena:='';
Millones:='';
if (tres[2]='1') and (tres[3]<>'0') then
begin
Unidad:=Diez[strtoint(tres[3])];
Decena:='';
end
else
begin
if tres[2]<>'0' then Decena:=Decenas[strtoint(tres[2])];
if tres[3]<>'0' then Unidad:=Unidades[strtoint(tres[3])];
// if tres[4]<>'0' then Unidad:=Unidades[strtoint(tres[4])];
end;
if (tres[1]='1') and (Unidad='') and (Decena='') and (Millones='') then
Centena:='Cien'
else
if tres[1]<>'0' then
Centena:=Centenas[strtoint(tres[1])]
else
Centena:='';
Result:=
// Millones + ifs((Millones<>'') and ((Centena<>'') or (Decena<>'')), ' ', '')
Centena + ifs((Centena<>'') and ((Decena<>'') or (Unidad<>'')), ' ', '')
+ Decena + ifs((Decena<>'') and (Unidad<>''),' y ', '') + Unidad;
end;
begin
if (valor>9999999.99) or (valor<0) then
begin
msg:='El Valor esta fuera del rango permitido';
msg:=msg+'El numero debe ser menor que: 9.999.999.99';
showmessage(msg);
Result:='';
exit;
end;
if valor=0 then
begin
Result:='';
Exit;
end;
Texto:=formatfloat('0000000.00',valor);
Millon:=MiniExtenso(copy(Texto, 1,3));
Millar:=MiniExtenso(Copy(Texto,2,3));
Centena:=MiniExtenso(Copy(Texto,5,3));
Centavos:=MiniExtenso('0'+Copy(Texto,9,2));
Result:=Millar;
if Millon<>'' then
if copy(texto,1,3)='1' then
Result:=Result+' Un Millon'
else
Result:=Result+' Millones ';
if Millar<>'' then
if copy(texto,4,3)='000' then
Result:=Result+' Mil pesos'
else
Result:=Result+' Mil ';
if (Millar+Centena <>'') then
Result:=Result+Centena;
if (Millar='') and (copy(texto,4,3)='001') then
Result:=Result+' Peso'
else
if (copy(texto,4,3)<>'000') then
Result:=Result+' Pesos ';

{ if Centavos='' then
begin
Result:=Result+'.';
Exit;
end
else
begin
if Millar+Centena='' then
Result:=Centavos
else
Result:=Result+' con '+Centavos;
if (copy(texto,8,2)='01') and (Centavos<>'') then
Result:=Result+' Centavos.'
else
Result:=Result+' Centavos.';
end;}
end;
end.

maeyanes
21-05-2008, 18:01:57
Hola...

Te recomiendo que cheques los enlaces que se muestran en la parte inferior de este hilo, ahí donde dice: Temas Similares.

También si haces una búsqueda por ATexto podrás encontrar información que te sirva...


Saludos...

enecumene
21-05-2008, 18:05:50
Hola, el componente ATexto se encuentra en el FTP del club,

http://www.terawiki.clubdelphi.com/archivos/Delphi-Win32/Componentes/ATexto.zip

Y Concordando con maeyanes, con una pequeña busqueda por el foro lo hubieses encontrado.

Saludos. ;)

odrack
21-05-2008, 18:08:55
Gracias por responder, anteriormente lo habia buscado en el foro y encontre varios temas similares interesantes, descargue Atexto pero no he logrado instalarlo, me podrian explicar de forma rapida como cargar el archivo??

Saludos

enecumene
21-05-2008, 18:17:44
Pues es tan facil instalar como cualquier otro componente común, a traves de la solapa components/install component, luego buscas el .PAS y lo instalas.

Saludos.

ContraVeneno
21-05-2008, 18:32:04
http://www.clubdelphi.com/trucos/index.php?id=208&scroll=0&scrollb=0

http://www.clubdelphi.com/foros/showpost.php?p=214435&postcount=15

odrack
21-05-2008, 18:50:42
No he logrado instalar Atexto ya que no tengo la opcion de components/install component, estoy trabajando actualmente con la version Code Gear win32, he intentado instalar con import component pero solo me permite agregar 3 tipos, a) Type Library. b) ActiveX Control y c) .NET Assembly, y ninguna de estas opciones puedo instalar .PAS.

Tengo que instalar desde otra ruta acaso??

Saludos, gracias.

enecumene
21-05-2008, 18:54:41
A ver, Pues, como no habias mencionado que version delphi estas utilizando, ahora es momento de mencionarlo. Pues la ruta que te mostre se aplica a Delphi 7.

Saludos.

odrack
21-05-2008, 18:59:23
La version que utilizo es CodeGear Delphi 2007 for Win32 R2 Version 11.0.2902.1047

En esta versión se puede instalar el componente??

enecumene
21-05-2008, 19:06:23
La version que utilizo es CodeGear Delphi 2007 for Win32 R2 Version 11.0.2902.1047

En esta versión se puede instalar el componente??

Realmente no sabria decirte ya que nunca he usado Delphi 2007, y yo creo que si se puede, a ver si algún compañero que use esa version te ayude.

Saludos. ;)

odrack
21-05-2008, 19:09:36
Ok, he encontrado esta nota en el foro y voy a probarlo. De todas formas gracias.

Esta explicación es válida para Delphi 7 o inferior, para Delphi 8 o superior el procedimiento es distinto, ya que los desarrolladores de Borland/CodeGear removieron este menú desde esta versión, por lo que el procedimiento para agregar componentes sueltos deberás hacerlo desde File, Open y abrir el paquete predeterminado de paquetes del usuario en Delphi desde la carpeta de instalación y agregarlos o crear un nuevo paquete (package).

enecumene
21-05-2008, 19:17:44
Pues manos a la carga!!, aqui te espero para cualquier duda. ;)

Saludos.

odrack
21-05-2008, 19:25:01
Lo he tratado de instalar de la siguiente forma NEW ITEMS - Package - Abrir atexto.pas. Lo he guardado todo en una carpeta y en el archivo PAckage lo he instalado (boton derecho install), al finalizar el proceso me muestra que s e ha isntalado el package. ¿Ahora como puedo comprobar que ralmente se insatalo? y ¿como puedo ejecutarlo? ya que estoy confundido con esto.

Saludos

enecumene
21-05-2008, 19:30:40
Pues, si luego de crear el paquete con el ATexto.pas y ejecutado e instalado, en las solapas de los componentes debe haber uno que diga aloySoft si no es asi debes abrir el paquete creado y darle al boton install.

Saludos.

odrack
21-05-2008, 19:36:00
Ya lo he revisado y ya se encuentra instalado. Actualmente utilizo edit1.text := atexto.tletras(strtofloat(edit2.text)); para ejecutar el codigo que tengo para cambio de numero y letras, ¿Como lo llamo desde algun boton?

perdona las molestias que te ocasiono.:p

enecumene
21-05-2008, 19:38:21
procedure TForm1.Button1Click(Sender: TObject);
var Numero: Extended;
begin
Numero := StrToFloat(Edit1.Text);
Letras1.Numero := Trunc(Numero);
Edit2.Text := Format('%s CON %d/100 .-', [Letras1.AsString, Trunc(100*Frac(Numero))]);
end;

Molestias no hay ninguna ;).

Saludos.

odrack
21-05-2008, 19:43:04
Muchas gracias funciona perfectamente. solo tengo una duda mas, cuando yo quiera hacer la distrubución de este programa (mi desarrollo) ¿Tengo que agregar algun componente o se compila con el mismo programa para su distribucion?

enecumene
21-05-2008, 19:47:55
Muchas gracias funciona perfectamente. solo tengo una duda mas, cuando yo quiera hacer la distrubución de este programa (mi desarrollo) ¿Tengo que agregar algun componente o se compila con el mismo programa para su distribucion?

No, al compilar el programa el componente queda parte de ella, pues, no utiliza archivos externos como Dll, etc, etc.

Saludos.

odrack
21-05-2008, 19:49:36
Muchas gracias, de vdd que no se que haria sin todo su apoyo y sin este foro claro esta.

Saludos.

elchino07
02-12-2008, 23:26:37
El resultado me sale en letras minusculas, hay alguna manera de que el resultado se muestre en mayusculas o algo que yo haya omitido?

jhonny
02-12-2008, 23:33:47
El resultado me sale en letras minusculas, hay alguna manera de que el resultado se muestre en mayusculas o algo que yo haya omitido?

Antepones la función AnsiUpperCase de la unidad SysUtils y listo ;).

enecumene
02-12-2008, 23:34:24
El resultado me sale en letras minusculas, hay alguna manera de que el resultado se muestre en mayusculas o algo que yo haya omitido?

Si quieres que las letras sean en mayúsculas, sólo debes usar la función Uppercase:

Edit2.Text := Format('%s CON %d/100 .-', [Uppercase(Letras1.AsString), Trunc(100*Frac(Numero))]);

Saludos.

ContraVeneno
03-12-2008, 00:22:01
AnsiUpperCase amigo enecumene, AnsiUpperCase (http://www.clubdelphi.com/foros/showthread.php?t=56757)

enecumene
03-12-2008, 00:25:31
AnsiUpperCase amigo enecumene, AnsiUpperCase (http://www.clubdelphi.com/foros/showthread.php?t=56757)

¡Hostia!, tienes razón Contra, Gracias :D

Saludos.