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