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
public
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
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.