Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Sobre el componente ATexto 2.0 (https://www.clubdelphi.com/foros/showthread.php?t=35695)

dec 18-09-2006 20:56:43

Sobre el componente ATexto 2.0
 
Hola,

Cuando el apartado de componentes del ClubDelphi estaba disponible había allí un componente de nombre ATexto y cuya versión era 2.0 y cuyo cometido era "traducir" números a su correspondientes "texto", esto es, ya sabéis:

Código:

85 = Ochenta y cinco

782 = Setecientos ochenta y dos

etc., etc.

Pues bien, me pregunto cómo es que no mantuve a buen recaudo dicho componente, y, os pregunto si lo tenéis alguno para hacérmelo llegar, bien por correo o bien adjuntándolo a este mismo Hilo.

Mi intención es guardarlo, como debe ser, y traducirlo a PHP. ¿Qué me decís? ¡Gracias de antemano! :) :D

vtdeleon 18-09-2006 21:13:43

Saludos

Buscando en google, me encontre con esto:
http://delphi.garcia-cuervo.com/Recursos.htm

No te aseguro que sea la misma version.

marcoszorrilla 18-09-2006 21:20:55

Código Delphi [-]
    Convertir una cifra numerica a cantidad en letra (15 -> "QUINCE") 

   Util para rellenar los impresos de giros de correos, por ejemplo 

      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;

Yo tenía esta función guardada por ahí a ver si te sirve la idea.

Un Saludo.

dec 18-09-2006 21:41:25

Hola,

Cita:

Empezado por Troi
Buscando en google, me encontre con esto:
http://delphi.garcia-cuervo.com/Recursos.htm

No te aseguro que sea la misma version.

Sí, justamente, ese es el componente y la versión que decía. ;) Muchas gracias Troi, busqué también por Google, pero, no lo encontré...

Respecto de la función que propones Marcos, sí, la había visto en los Foros y, no diré yo que esté mal.

Miré por el componente ATexto 2.0 porque sabía que era muy curioso. Alguna vez incluso utilizé alguno similar, pero, no era ATexto.

Código Delphi [-]
unit ATexto;
{
-------------------------------------------------------------------------
ENTRADA : Número (Currency o Extended)
SALIDA  : Cadena de texto que representa el número
EJEMPLO : 38 -> treinta y ocho
-------------------------------------------------------------------------

FECHA   : 07 -abril-1998   [17:03]
VERSIÓN : 1.2
AUTOR   : Antoni Aloy López
E-MAIL  : tonialoy @ yahoo.com
-------------------------------------------------------------
FECHA   : 09 -noviembre-2000   [21:34]
VERSIÓN : 2.0
AUTOR   : Savierhs López Arteaga
E-MAIL  : savierhs @ hotmail.com

-------------------------------------------------------------------------
HISTORIA:

Versión 0.99 -> Sólo funciona hasta 99 millones

versión 1.0  -> Se amplía el funcionamiento a las centenas de millón
        Se corrige un error en las centenas de millón que
        hacía que saliesen en femenino.

versión 1.1  -> Se corrige un error que hacía que las decenas y centenas
        de millon salgan en femenino cuando acaban en uno.

versión 1.2  -> Se actualiza el componente para que admita valores decimales
        y dé la salida en euros.
        Se ha añadido una opción para determinar el separador de
        centimos, y una nueva propiedad que nos da los céntimos
        Se corrigen algunos acentos.
        ATENCIÓN: Con esta versión cambio el e-mail de consultas a tonialoy @ yahoo.com

versión 2.0  -> Ahora traduce valores menores a 10 Trillones.
                Se optimizan todas las rutinas de conversión de numeros.
                Se reemplazan algunas otras rutinas.
                Se agrega una propiedad que permite indicar el tipo de
                moneda en la salida Ej: euros o pesetas.
                Se agrega una propiedad que permite indicar el tipo de
                centimos o centavos en la salida Ej: ctvs. o centimos.
                Se renombra la propiedad "Euros" por "Masculino", la
                cual decide sobre las terminaciones de la descripción.
                Se corrigen otros acentos.
                NOTA: Tambien puede enviar cualquier consulta al
                      siguiente E-Mail: savierhs @ hotmail.com

--------------------------------------------------------------------------
Este componente se pone a dominio público, aunque me reservo el derecho
sobre su autoría. Es decir, puede utilizarse y modificarse libremente
siempre y cuando se me cite como autor del componente original.

Como siempre, no existen garantías de que el componente funcione en todas
las circunstancias, úsalo a tu cuenta y riesgo.

Comentarios, albanzas y agradecimiento enterno,... serán bien recibidos.
--------------------------------------------------------------------------
ATENCIÓN:
  Si ya tiene instalado este componente, desinstalelo antes de colocar
  la nueva versión
--------------------------------------------------------------------------
}

Bueno, muchas gracias a los dos, ahora a traducirlo a PHP... ¡qué pronto lo he dicho! :D

Casimiro Notevi 18-09-2006 21:47:23

1 Archivos Adjunto(s)
Por si acaso te sirve, yo uso esta función desde hace años, no sé de quién es, la utilizo tal y como me la pasaron, creo que ni la toqué y nunca he tenido problema con ella.
Tiene la particularidad de traducir a castellano y catalán, por lo que es fácilmente adaptable para otros idiomas.

dec 18-09-2006 21:52:22

Hola,

Te lo agradezco Casimiro. :)

Franksxs 29-12-2007 02:05:30

HOla, El codigo que proporciono marcoszorrilla esta muy bueno y se le agradece la ayuda; pero solo hay un problema.

no convierte decimales y necesito que convierta decimales, alguno de ustedes podria pasarme un codigo que convierta tambien decimales?

gracias por su atención

marcoszorrilla 29-12-2007 14:00:12

El código recuerdo haberlo modificado con la entrada del Euro, finalmente lo he encontrado:

Código Delphi [-]
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.

Caral 29-12-2007 16:04:38

Hola
Este hilo es muy viejo, pero se reactivo por alguna razón.
No se si sera la versión 2, pero este es el que me pasaste Dec. en algún momento.
Saludos

dec 29-12-2007 16:18:35

Hola,

Sí; creo que es el mismo que se encuentra en el TeraWiki. :)

jirbert 20-01-2008 04:57:07

marcoszorrilla gracias!!! con respecto al cod. el primero me funciono de perfectamente,, pero el segundo que generastes para los decimales no me funciona en la parte de las variables cuando se cren,
var
Millones,Miles,Unidades,n: LongInt;
Linea : String;
entero,decimal:variant;

n1,n2ouble; --> esta variable me dice: undeclared identifier: 'ouble':confused:

te agradeceria la ayuda!!! :rolleyes::cool:

saludos!!!
gracias!!!

dec 20-01-2008 09:09:52

Hola,

Pareciera que es una errata, y, que, donde dice:

Código Delphi [-]
n1,n2ouble;

Debe decir:

Código Delphi [-]
n1,n2: double;

marcoszorrilla 20-01-2008 10:34:34

Ya lo he arreglado, pero no era ni error ni errata, ya me ha pasado otra vez, es el "parser", que se ve no le gusta la combinación esa:

Código Delphi [-]
      var
         Millones,Miles,Unidades,numero: Longint;
         Linea : String;
         entero,decimal:variant;
         n1,n2:Double;


Código Delphi [-]
      var
         Millones,Miles,Unidades,numero: Longint;
         Linea : String;
         entero,decimal:variant;
         n1,n2: Double;


La primera y la segunda son exactamente iguales, pero en la primera no hay un espacio entre los dos puntos y Double.

Un Saludo.

ixMike 20-01-2008 14:42:34

Llego tarde, pero en trucomanía hay una función que hace exactamente lo mismo (no sé si con decimales funciona).

Salu2. :)

jirbert 20-01-2008 20:54:41

gracias a todos.. bueno ya modifique la variable como em dijeron!!! y la verifico perfectamente pero en la parte de

xIntToLetras:=Linea;

me dice lo siguiente:

not enough actual parameters

de verdad gracias a todos y disculpen la molestia...

jirbert 20-01-2008 22:59:54

bueno otra cosa :) quisiera saber si se puede complementar una laber en otro es decir, por lo menos cuando da el resultado traducido a letras!!! tener un limite y continuar en la linea de abajo:

1.254.525,58
un millon docientos cincuenta y cuatro mil quinientos veinticinco con cincuenta y ocho centimos...


a

1.254.525,58
un millon docientos cincuenta y cuatro mil quinientos veinticinco
con cincuenta y ocho centimos...

:confused::confused::confused::confused:


Caral 20-01-2008 23:20:41

Hola
La verdad no veo como hacerlo en un label, creo que seria mejor usar un memo.
Saludos

Lepe 21-01-2008 07:21:43

Estableciendo el Autosize a false, wordwrap a true del label, obtendrás ese comportamiento.

Saludos


La franja horaria es GMT +2. Ahora son las 12:43:26.

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