Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   transformar números a letras. (https://www.clubdelphi.com/foros/showthread.php?t=63676)

BuRtOn 26-02-2009 01:58:41

transformar números a letras.
 
Saludos amigos tiempo sin venir por estos lados....Bueno amigos lo que necesito es algo muy simple o eso parece pero es algo más bien complejo, mire lo que sucede es que tengo que generar una factura y existe una parte de la factura que me toca hacer lo siguiente:

1. Escribir una cantidad como por ejemplo está:

10'000.000

2. en otro costado de la misma factura tiene que salir la misma cantidad ingresada pero en letras de está forma:

DIEZ MILLONES

en pocas palabras cualquier número o cifra que ingrese me toca que la aplicación me arroje sus respectivas letras como en el ejemplo anterior, aqui pongo más ejemplos:

0 ---> CERO
1 ---> ÚNO
2 ---> DOS
100 ---> CIEN
200 ---> DOCIENTOS
150.00 ---> QUINCE MIL
100.000 ---> CIEN MIL
1'800.000 ---> UN MILLÓN OCHO CIENTOS MIL

Asi sucesivamente con todos los números que desee, creo que existe un componente por que un amigo algún día lo mensiono, pero me gustaria que si alguien tiene más información sobre este proceso me colabore, muchas gracias amigos que estén muy bien.

MAXIUM 26-02-2009 02:06:54

Opción, buscar el foro y en la sección trucos. Gracias y siga participando ;)

roman 26-02-2009 02:07:13

El componente en cuestión lo puedes encontrar aquí mismo en el Club, en el FTP. Busca en Delphi-Win32|Componentes y ahí lo verás, se llama ATexto. No te pongo el enlace directo para que tengas oportunidad de pasearte por el sitio y ver que disponemos de no poco material :).

// Saludos

JuanHC 26-02-2009 09:39:13

Si no la encuentras
 
Hola,
Si no lo encuentras tal como te dicen anteriormente, puedo decirte la rutina que uso ya para pasar numeros a letras.
Quizas sea un poco "cutre", pero eso si, funciona.
Saludps

cmm07 26-02-2009 13:25:13

haber si te sirve este código, lo saque de google:

Código Delphi [-]
 
procedure TForm1.Button1Click(Sender: TObject);
 
function xIntToLletras(Numero:LongInt):String;
 
  function xxIntToLletras(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: Longint;
   Linea : String;
begin 
  {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';
              xIntToLletras := Linea;
              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 + xxIntToLletras(Millones)
                                   + ' MILLONES ';
 
  if Miles =1 then Linea:= Linea + ' MIL '
  else if Miles>1 then Linea := Linea + xxIntToLletras(Miles)+
                                ' MIL ';
 
  if Unidades >0 then Linea := Linea + xxIntToLletras(Unidades);
 
  xIntToLletras := Linea;
end; 
 
begin 
  Label1.Caption:= xIntToLletras(StrToInt(Edit1.Text));
end;

PD: Funciona perfecto!!!.

BuRtOn 26-02-2009 17:03:54

Saludos, gracias mm07 ya hice lo que deseaba, y pues el código que expones es identico ó muy similar al del componente ATexto, pero de igual forma tambien es valido hacerlo, les agradezco amigos que me ayudaran, como siempre me sacan de aprietos....Gracias.

krlox31416 27-02-2009 20:28:28

tambien te puedes chacar la función del amigo contraveneno
 
Puedes checar en los foros hay vartias rutinas que hacen lo que pides...
Ahora bien para evitarte de lios bajate el componente Atexto...

Yo tambien hace tiempo tenia el mismo problema...
y primero lo que hice fue entender el codigo de la funcion que me paso contraveneno...

despues la implemente... pero mi problema seguia ya que no sabia como mandar llamar su función...

Hasta ese momento todo ok´s pero despues me faltaba validar que en el edit que queria convertir numeros a latras en vez de punto decimal validart que cambie el punto decimal por una coma eso tambien lo encontre con otra función que baje y modifique...

aunque parece dificil en realidad es facil viendolo desde el punto de vita que no programes:D...

pero debes checar por lo menos que se intenta hacer con el codigo...

te paso la función del amigo contraveneno... aclaro que esa función la creeo él

Código Delphi [-]
´
unit Unit6;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls, ComCtrls, Buttons, Mask, Grids, DBGrids;
type
  TForm6 = class(TForm)
    Label1: TLabel;
    Label2: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Edit4: TEdit;
    Edit5: TEdit;
    Label3: TLabel;
    Bevel1: TBevel;
    BitBtn1: TBitBtn;
    BitBtn2: TBitBtn;
    BitBtn3: TBitBtn;
    BitBtn4: TBitBtn;
    BitBtn5: TBitBtn;
    Bevel2: TBevel;
    Bevel3: TBevel;
    StatusBar1: TStatusBar;
    Label8: TLabel;
    Label9: TLabel;
    BitBtn6: TBitBtn;
    Timer1: TTimer;
    DBGrid1: TDBGrid;
    procedure Timer1Timer(Sender: TObject);
    procedure Edit1Change(Sender: TObject);
    procedure Edit1KeyPress(Sender: TObject; var Key: Char);
    procedure Edit2KeyPress(Sender: TObject; var Key: Char);
    procedure Edit3KeyPress(Sender: TObject; var Key: Char);
    procedure Edit4KeyPress(Sender: TObject; var Key: Char);
    procedure Edit5KeyPress(Sender: TObject; var Key: Char);
    procedure DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
      DataCol: Integer; Column: TColumn; State: TGridDrawState);
    procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
    procedure FormCreate(Sender: TObject);
    procedure BitBtn1Click(Sender: TObject);
    procedure BitBtn2Click(Sender: TObject);
    procedure BitBtn3Click(Sender: TObject);
    procedure BitBtn4Click(Sender: TObject);
    procedure FormActivate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
var
  Form6: TForm6;
  costo: extended;/// esto variable ya la ocupo para otras cosas... no es parte de la función
  mensaje:integer;///esto variable ya la ocupo para otras cosas... no es 
  cos: integer;///esto variable ya la ocupo para otras cosas... no es 
////////////////////todas las variables que siguen abajo son de la función
  i, MonNal: 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;
  Function CantidadEnLetra(curCantidad: Currency; MonNal: integer): String;// la funcion la declaro aqui porque la mando llamar en otra forma eso es opcional si tu quieres o la puedes mandar llamar en tu misma forma
  implementation
uses Unit2, Unit3;
{$R *.dfm}
Function CantidadEnLetra(curCantidad: Currency; MonNal: integer): 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] := 'DIESISEIS';
Unidades[16] := 'DIESISIETE'; Unidades[17] := 'DIESIOCHO'; Unidades[18] := 'DIESINUEVE';
Unidades[19] := 'VEINTE'; Unidades[20] := 'VEINTIUNO'; Unidades[21] := 'VEINTIDOS';
Unidades[22] := 'VEINTITRES'; Unidades[23] := 'VEINTICUATRO'; Unidades[24] := 'VEINTICINCO';
Unidades[25] := 'VEINTISEIS'; 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;
                         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;
                               SegundoDigito := Digito;
                            end;
                         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;
               End;
        end
        Else
        begin
        BloqueCero := BloqueCero + 1;
        End;
        Cantidad := Int(Cantidad / 10);
        If Cantidad = 0 Then
           begin
           Break;
           End;
           end;
Case NumeroBloques of 1:
                         Resultado := Bloque;
                      2:
                         begin
                         if BloqueCero = 3 then
                        Temp := ''
                         else
                         Temp := ' MIL';
                                 Resultado := Bloque + Temp + Resultado;
                          end;
                       3:
                          begin
                          If (PrimerDigito = 1) and (SegundoDigito = 0) and (TercerDigito = 0) then
                             Temp := ' MILLON'
                             else
                                 Temp := ' MILLONES';
                                 Resultado := Bloque + Temp + Resultado;
                          end;
                End;
                NumeroBloques := NumeroBloques + 1;
                Until Cantidad = 0;
                        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 := 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 := Resultado + Temp + strCentavos;
                                                    end;
                                          end;
end;
/// ya puedes mandar llamar la función... ya sea en esta forma o en cualquiera...

Código Delphi [-]
 
solo recuerda que en tu edit valides que ponga comas en vez de punto decimal
ej: 123.56 por 123,56 y todo saldra ok's...
/// aqui la mandas llamar segun el componente y evento que quieras usar
var i: integer;
begin
i:=1;
Edit2.Text:= CantidadEnLetra(StrToFloat(Edit1.Text),i)
end;

saludos!!!...:)


La franja horaria es GMT +2. Ahora son las 13:21:09.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi