Ver Mensaje Individual
  #3  
Antiguo 13-05-2014
Avatar de nlsgarcia
[nlsgarcia] nlsgarcia is offline
Miembro Premium
 
Registrado: feb 2007
Ubicación: Caracas, Venezuela
Posts: 2.206
Reputación: 21
nlsgarcia Tiene un aura espectacularnlsgarcia Tiene un aura espectacular
Jovalca,

Cita:
...Problema con Numero a Letra - Muestra "Un Mil" en vez de "Mil"...
Revisa este código:
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;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

// Convierte numeros a letras de forma recursiva

function NumbersToLetters(Number: Double): string;

const
  Numbers: array[1..9] of String = ('Uno', 'Dos', 'Tres', 'Cuatro',
    'Cinco', 'Seis', 'Siete', 'Ocho', 'Nueve');

  Numbers2: 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.00;
  Max = 1000000000.00;
  
  function RecurseNumber(N: LongWord): string;
  begin
    case N of

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

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

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

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

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

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

    end; {Case N of}

  end; {RecurseNumber}

begin
  if (Number >= Min) and (Number < Max) then
     begin
        Result := RecurseNumber(Round(Int(Number)));
        Result := Result +  ' con ' + Format('%.2d',[Round(Frac(Number) * 100)]) + '/100';
     end
  else
     Result := '-1';
end;

procedure TForm1.Button1Click(Sender: TObject);
var
   N1 : Double;
begin
   if TryStrToFloat(Edit1.Text,N1) then 
      ShowMessage(NumbersToLetters(N1)); 
end;

end.
El código anterior en Delphi 7 bajo Windows 7 Professional x32, convierte recursivamente números a letras en el rango de 1.00 a 999999999.99 teniendo la posibilidad de cambiar un mil por mil, sin embargo es más preciso y seguro al momento de hacer un cheque usar un mil en vez de mil. Un ejemplo de conversión es el que se muestra en la siguiente imagen:



Espero sea útil

Nelson.

Última edición por nlsgarcia fecha: 13-05-2014 a las 17:14:47.
Responder Con Cita