将数字金额转换成英文大写金额(200分)

  • 主题发起人 主题发起人 快乐男孩
  • 开始时间 开始时间

快乐男孩

Unregistered / Unconfirmed
GUEST, unregistred user!
如下:
USD12315646.56
TWELVE MILLION THREE HUNDRED FIFTEEN THOUSAND SIX HUNDRED FORTY-SIX AND 56/100 ONLY.
 
转贴
unit NumberToLetters;

interface
{var
Calls: Integer;} //Use to count number of recursive calls
(* This function returns the written equivalent of a number. *)
function NumToLetters(Number: Real): string;

implementation
uses SysUtils;

type
TNumberStr = string[13];

const
Numbers: array[1..19] of TNumberStr = ('one', 'two', 'three', 'four',
'five', 'six', 'seven', 'eight', 'nine', 'ten', 'eleven', 'twelve',
'thirteen', 'fourteen', 'fifteen', 'sixteen', 'seventeen', 'eighteen',
'nineteen');

Tenths: array[1..9] of TNumberStr = ('ten', 'twenty', 'thirty', 'forty',
'fifty', 'sixty', 'seventy', 'eighty', 'ninety');

ErrorString = 'not in valid range';

Min = 1.00;
Max = 4294967295.99;

function NumToLetters(Number: Real): string;

function RecurseNumber(N: LongWord): string;
begin

{Inc(Calls);} //Use to count the number of recursive calls
case N of
1..19:
Result := Numbers[N];
20..99:
Result := Tenths[N div 10] + ' ' + RecurseNumber(N mod 10);
100..999:
Result := Numbers[N div 100] + ' hundred ' + RecurseNumber(N mod 100);
1000..999999:
Result := RecurseNumber(N div 1000) + ' thousand ' +
RecurseNumber(N mod 1000);
1000000..999999999: Result := RecurseNumber(N div 1000000) + ' million '
+ RecurseNumber(N mod 1000000);
1000000000..4294967295: Result := RecurseNumber(N div 1000000000) +
' billion ' + RecurseNumber(N mod 1000000000);
end;
{Case N of}
end;
{RecurseNumber}
begin

{Calls := 0;} //Use to count the number of recursive calls
if (Number >= Min) and (Number <= Max) then

begin

Result := RecurseNumber(Round(Int(Number)));
{Added for cents in a currency value}
if not(Frac(Number) = 0.00) then

Result := Result + ' and ' + IntToStr(Round(Frac(Number) * 100)) +
'/100';
end
else

raise ERangeError.CreateFmt('%g ' + ErrorString + ' %g..%g',
[Number, Min, Max]);
end;
{NumToLetters}
end.
 
很好!
这里稍稍修改一下:
if not(Frac(Number) = 0.00) then

begin
if Result<>'' then
Result := Result + ' and ' + IntToStr(Round(Frac(Number) * 100)) +
'/100';
else

Result:=IntToStr(Round(Frac(Number) * 100)) +'/100';
end
 
整理后:
unit Unit2;
interface
{var
Calls: Integer;} //Use to count number of recursive calls
(* This function returns the written equivalent of a number. *)
function NumToLetters(Number: Real): string;
implementation
uses SysUtils;

type
TNumberStr = string[13];

const
Numbers: array[1..19] of TNumberStr = ('one', 'two', 'three', 'four',
'five', 'six', 'seven', 'eight', 'nine', 'ten', 'eleven', 'twelve',
'thirteen', 'fourteen', 'fifteen', 'sixteen', 'seventeen', 'eighteen',
'nineteen');

Tenths: array[1..9] of TNumberStr = ('ten', 'twenty', 'thirty', 'forty',
'fifty', 'sixty', 'seventy', 'eighty', 'ninety');

ErrorString = 'not in valid range';

Min = 1.00;
Max = 4294967295.99;

function NumToLetters(Number: Real): string;
function RecurseNumber(N: LongWord): string;
begin

{Inc(Calls);} //Use to count the number of recursive calls
case N of
1..19:
Result := Numbers[N];
20..99:
Result := Tenths[N div 10] + ' ' + RecurseNumber(N mod 10);
100..999:
Result := Numbers[N div 100] + ' hundred ' + RecurseNumber(N mod 100);
1000..999999:
Result := RecurseNumber(N div 1000) + ' thousand ' +
RecurseNumber(N mod 1000);
1000000..999999999: Result := RecurseNumber(N div 1000000) + ' million '
+ RecurseNumber(N mod 1000000);
1000000000..4294967295: Result := RecurseNumber(N div 1000000000) +
' billion ' + RecurseNumber(N mod 1000000000);
end;
{Case N of}
end;
{RecurseNumber}
begin

{Calls := 0;} //Use to count the number of recursive calls
if (Number >= Min) and (Number <= Max) then
begin
Result := RecurseNumber(Round(Int(Number)));
{Added for cents in a currency value}
if not(Frac(Number) = 0.00) then
begin
if Result<>'' then
Result := Result + ' and ' + IntToStr(Round(Frac(Number) * 100)) + '/100'
else
Result := IntToStr(Round(Frac(Number) * 100)) +'/100';
end;
end
else
raise ERangeError.CreateFmt('%g ' + ErrorString + ' %g..%g',
[Number, Min, Max]);
end;
{NumToLetters}
end.

//调用 edit2.Text := UpperCase(NumToLetters(12315646.56)) + ' ONLY.';
//12315646.56
//TWELVE MILLION THREE HUNDRED FIFTEEN THOUSAND SIX HUNDRED FORTY SIX AND 56/100 ONLY.
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
572
import
I
I
回复
0
查看
955
import
I
后退
顶部