Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros temas > Trucos
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Los mejores trucos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 20-07-2015
Avatar de nlsgarcia
[nlsgarcia] nlsgarcia is offline
Miembro Premium
 
Registrado: feb 2007
Ubicación: Caracas, Venezuela
Posts: 2.206
Poder: 21
nlsgarcia Tiene un aura espectacularnlsgarcia Tiene un aura espectacular
Convertir números a letras por medio de una función recursiva

Club Delphi,

Revisen el siguiente código en Delphi:
Código Delphi [-]
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    Memo1: TMemo;
    Button2: TButton;
    GroupBox1: TGroupBox;
    RadioButton1: TRadioButton;
    RadioButton2: TRadioButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

// Convierte números a letras de forma recursiva
function NumbersToLetters(Number: Double; Centime : Boolean) : String;
const
  Digit: array[1..9] of String = ('Uno', 'Dos', 'Tres',
                                  'Cuatro', 'Cinco', 'Seis',
                                  'Siete', 'Ocho', 'Nueve');

  Numeral: array[11..19] of String = ('Once', 'Doce', 'Trece',
                                      'Catorce', 'Quince', 'Diez y Seis',
                                      'Diez y Siete', 'Diez y Ocho', 'Diez y Nueve');

  Tenths: array[1..9] of String = ('Diez', 'Veinte', 'Trienta',
                                   'Cuarenta', 'Cincuenta', 'Sesenta',
                                   'Setenta', 'Ochenta', 'Noventa');

  Hundreds : array[1..9] of String = ('Cien ', 'Docientos ', 'Trecientos ',
                                      'Cuatrocientos ', 'Quinientos ', 'Seicientos ',
                                      'Setecientos ', 'Ochocientos ', 'Novecientos ');

  Min = 1;
  Max = 4294967295;

  function RecursiveNumber(N: LongWord): String;
  begin

    case N of

      1..9:
      begin
         Result := Digit[N];
      end;

      11..19:
      begin
         Result := Numeral[N]
      end;

      10,20..99:
      begin
         if (N Mod 10) = 0 then
            Result := Tenths[N div 10] + RecursiveNumber(N mod 10)
         else
            Result := Tenths[N div 10] + ' y '  + RecursiveNumber(N mod 10);
      end;

      100..999:
      begin
        if (N = 100) or (N >= 200) then Result := Hundreds[N div 100] + RecursiveNumber(N mod 100);
        if (N > 100) and (N < 200) then Result := 'Ciento ' + RecursiveNumber(N mod 100);
      end;

      1000..999999:
      begin
         if (Number >= 1000) and (Number < 2000) then
            Result := 'Un Mil ' + RecursiveNumber(N mod 1000)
         else
            Result := RecursiveNumber(N div 1000) + ' Mil ' + RecursiveNumber(N mod 1000);
      end;

      1000000..999999999:
      begin
         if (Number >= 1000000) and (Number < 2000000) then
            Result := 'Un Millon ' + RecursiveNumber(N mod 1000000)
         else
            Result := RecursiveNumber(N div 1000000) + ' Millones ' + RecursiveNumber(N mod 1000000);
      end;

      1000000000..4294967295:
      begin
         if (Number >= 1000000000) and (Number < 2000000000) then
            Result := 'Un Millardo ' + RecursiveNumber(N mod 1000000)
         else
            Result := RecursiveNumber(N div 1000000000) + ' Millardos ' + RecursiveNumber(N mod 1000000000);
      end;

    end;

  end;

var
   F : String;

begin
  if (Number >= Min) and (Number <= Max) then
     begin
        Result := RecursiveNumber(Trunc(Number));
        F := FormatFloat('00',Frac(Number) * 100);
        if Centime then
           Result := Result +  ' con ' + RecursiveNumber(StrToInt(F)) + ' Centimos'
        else
           Result := Result +  ' con ' + F + '/100';
     end
  else
     Result := '-1';
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
   RadioButton1.Checked := True;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
   Number : Double;
begin
   if TryStrToFloat(Edit1.Text,Number) then
   begin
      if RadioButton1.Checked then
         Memo1.Text := NumbersToLetters(Number,True);

      if RadioButton2.Checked then
         Memo1.Text := NumbersToLetters(Number,False)
   end
   else
      MessageDlg('Error en formato de Número',mtError,[mbOK],0);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
   Edit1.Text := EmptyStr;
   Memo1.Clear;
   RadioButton1.Checked := True;
   Edit1.SetFocus;
end;

end.
El código anterior en Delphi 7 sobre Windows 7 Professional x32 permite : Convertir números a letras por medio de una función recursiva y escoger si los céntimos son visualizados como letras o fracción, como se muestra en la siguiente imagen:



El código del ejemplo esta disponible en : NumbersToLetters.rar

Espero sea útil

Nelson.
Responder Con Cita
  #2  
Antiguo 20-07-2015
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.257
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
"con 99/100"
¿Eso dónde se usa?
Responder Con Cita
  #3  
Antiguo 20-07-2015
Avatar de nlsgarcia
[nlsgarcia] nlsgarcia is offline
Miembro Premium
 
Registrado: feb 2007
Ubicación: Caracas, Venezuela
Posts: 2.206
Poder: 21
nlsgarcia Tiene un aura espectacularnlsgarcia Tiene un aura espectacular
Casimiro,

Cita:
Empezado por Casimiro
..."con 99/100" ¿Eso dónde se usa?...
En Venezuela se usa al momento de hacer un cheque manualmente, es una forma de abreviar los céntimos.

Saludos,

Nelson.
Responder Con Cita
  #4  
Antiguo 20-07-2015
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.257
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por nlsgarcia Ver Mensaje
es una forma de abreviar los céntimos
Pues diría que no abrevia nada, sino todo lo contrario:
Código:
,99
99/100
Responder Con Cita
  #5  
Antiguo 20-07-2015
Avatar de nlsgarcia
[nlsgarcia] nlsgarcia is offline
Miembro Premium
 
Registrado: feb 2007
Ubicación: Caracas, Venezuela
Posts: 2.206
Poder: 21
nlsgarcia Tiene un aura espectacularnlsgarcia Tiene un aura espectacular
Casimiro,

Cita:
Empezado por Casimiro
...no abrevia nada, sino todo lo contrario...


Abrevia con respecto a la conversión de números a letras como se puede observar en la imagen del Msg #1.

Saludos,

Nelson.
Responder Con Cita
  #6  
Antiguo 20-07-2015
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.257
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Ya, claro, pero es que entonces no ha sido convertido a letras
Responder Con Cita
  #7  
Antiguo 20-07-2015
[egostar] egostar is offline
Registrado
 
Registrado: feb 2006
Posts: 6.562
Poder: 25
egostar Va camino a la fama
Cita:
Empezado por Casimiro Notevi Ver Mensaje
"con 99/100"
¿Eso dónde se usa?
En México se usa y representa los céntimos de un peso los cuales no se convierten a letra. En términos legales cualquier cantidad expresada en letra (normalmente cheques y facturas) y que llevan cantidad en letra se deben escribir con el formato de Pesos con letra, los centavos representados por la fracción de 100, más las letras M.N. (Moneda Nacional).

De tal forma que la cantidad

$1,250.35

se escribe así:

Un Mil Docientos Cincuenta Pesos 35/100 M.N.

Saludos
__________________
"La forma de empezar es dejar de hablar y empezar a hacerlo." - Walt Disney
Responder Con Cita
  #8  
Antiguo 20-07-2015
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.257
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Curioso.
Responder Con Cita
  #9  
Antiguo 20-07-2015
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.549
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Estaría bien subirlo al FTP, junto con el ejemplo.


Ah!!!! y gracias por compartirlo.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #10  
Antiguo 20-07-2015
Avatar de nlsgarcia
[nlsgarcia] nlsgarcia is offline
Miembro Premium
 
Registrado: feb 2007
Ubicación: Caracas, Venezuela
Posts: 2.206
Poder: 21
nlsgarcia Tiene un aura espectacularnlsgarcia Tiene un aura espectacular
German,

Cita:
Empezado por Neftali
...Estaría bien subirlo al FTP...


En el Msg #1 hay un link al FTP del Club Delphi para descargar el código del ejemplo y su ejecutable.

Saludos,

Nelson.
Responder Con Cita
  #11  
Antiguo 20-07-2015
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.609
Poder: 30
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
Cita:
Empezado por egostar Ver Mensaje
En México se usa y representa los céntimos de un peso los cuales no se convierten a letra. En términos legales cualquier cantidad expresada en letra (normalmente cheques y facturas) y que llevan cantidad en letra se deben escribir con el formato de Pesos con letra, los centavos representados por la fracción de 100, más las letras M.N. (Moneda Nacional).
Eliseo lo ha explicado muy bien.

Me permito algunos comentarios sobre lo expuesto hasta ahora por los compañeros.

Es más correcto escribir doscientos que docientos. Y además deben evitarse las letras mayúsculas iniciales, con excepción de la primera palabra cuando sea inicio de enunciado. En español, y más concretamente en castellano, los números y las monedas, así como los adjetivos gentilicios, los nombres de los días de la semana, los meses y las estaciones del año, no deben iniciar con letra mayúscula (con la salvedad antes mencionada).

Adicionalmente, el un para decir un mil es opcional. Aparentemente se acostumbraba agregar el un para dificultar la alteración fraudulenta de documentos (cheques que podrían pasar de "mil trescientos..." a "ocho mil trescientos...", por ejemplo).

Por otro lado, Nelson, debes revisar tu función. Falta el acento en millon y centimos, hay erratas en varios centenarios (por ejemplo falta la ese en seicientos) y otras cantidades no están del todo bien, como "diez y seis", que para expresar cantidades con letra debería ser dieciséis.

Ahora, una recomendación de programador bibliotecario. Cuando creen este tipo de funciones, intenten ver más allá de la necesidad inmediata que desean resolver. Una gran función (o método) que convierte cantidades monetarias a su expresión con letra puede ser dividida en dos o más funciones que le den más utilidad al código. Por ejemplo, pueden crear una función que sirva para convertir cualquier número entero a su expresión con letras, y luego crear una segunda función que sirva para convertir cualquier cantidad monetaria (número decimal) a su expresión con letras. Entonces hacer que la segunda función se apoye llamando a la primera función.

Yendo más allá, a la primera función pueden agregarle un parámetro para indicar género (masculino, femenino y neutro). Y con ello podrán expresar con letra prácticamente cualquier cantidad que así deba aparecer en algún documento (cuadernos, paellas, etc.), sin limitar un código tan valioso para servir solamente con dinero.

Reciban un cordial saludo.
Responder Con Cita
  #12  
Antiguo 20-07-2015
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.257
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por Al González Ver Mensaje
Reciban un cordial saludo.
Responder Con Cita
  #13  
Antiguo 20-07-2015
[egostar] egostar is offline
Registrado
 
Registrado: feb 2006
Posts: 6.562
Poder: 25
egostar Va camino a la fama
Cita:
Empezado por Al González Ver Mensaje
Es más correcto escribir doscientos que docientos.
Anotado.

Cita:
Empezado por Al González Ver Mensaje
Y además deben evitarse las letras mayúsculas iniciales
Algunos vicios que tiene uno , de hecho normalmente las cantidades en letra no las escribo con minúsculas, todo en mayúsculas. De cualquier forma, anotado.

Cita:
Empezado por Al González Ver Mensaje
Adicionalmente, el un para decir un mil es opcional.
Así es, es opcional, igual que el "Son" ( Son dos mil ...... ) que se usa/usaba en los cheques, algo que ya está en franco "desuso" debido a la popularidad de las transacciones en línea y/o pagos a través de tarjetas.

Saludos
__________________
"La forma de empezar es dejar de hablar y empezar a hacerlo." - Walt Disney
Responder Con Cita
  #14  
Antiguo 20-07-2015
Avatar de nlsgarcia
[nlsgarcia] nlsgarcia is offline
Miembro Premium
 
Registrado: feb 2007
Ubicación: Caracas, Venezuela
Posts: 2.206
Poder: 21
nlsgarcia Tiene un aura espectacularnlsgarcia Tiene un aura espectacular
Al,

Cita:
Empezado por Al
...Es más correcto escribir doscientos que docientos...
Es correcto , igual aplica para trescientos y seiscientos.

Cita:
Empezado por Al
...deben evitarse las letras mayúsculas iniciales, con excepción de la primera palabra...
Es correcto , sin embargo en este caso es por seguridad, resalta más las cifras.

Cita:
Empezado por Al
...el un para decir un mil es opcional...
Es correcto , sin embargo en este caso es por seguridad, evita alteraciones al cheque en cifras entre 1000 y 1999.

Cita:
Empezado por Al
...Falta el acento en millón y céntimos...falta la ese en seiscientos...
Es correcto

Cita:
Empezado por Al
...otras cantidades no están del todo bien, como "diez y seis"...
Es correcto , sin embargo en este caso es por seguridad, resalta más las cifras.

Cita:
Empezado por Al
...una recomendación de programador bibliotecario...


Saludos,

Nelson.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Convertir Números a Letras con Centavos sam123 SQL 8 17-07-2015 03:57:02
Convertir números en letras c748a Varios 14 10-04-2015 21:52:18
Convertir Numeros en Letras hondaalberto Varios 1 13-06-2012 17:10:29
convertir Numeros en Letras Rofocale Varios 5 27-04-2010 05:55:54
Cómo convertir números a letras JKABARCA Varios 1 11-08-2008 01:20:41


La franja horaria es GMT +2. Ahora son las 01:07:52.


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
Copyright 1996-2007 Club Delphi