| 从网上找到了这个算法,原作是Dylan Thomas,但是我使用后发现有少少的缺点,例如英文金额的习惯是小数用Cents Twenty-Five这样的表示,但原版中没有小数的功能,只是简单的用百分数表示了。 另外十位的部分也有少许欠缺,25应为:Twenty-Five,再其次就是增加了0到1之间的小数的表示。我在网上搜了一下发现似乎没人修正这些问题,特此发贴与大家分享: {**********} { } { Number to letters unit version 1.2 } { } { copyright (C) Dylan Thomas 2000 } { } { License: No significant restrictions. } { } { Language: US. English } { } { Last Edit By logitech1229 2006. } { } {**********} unit NumberToLetters; interface (* 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; var Dec:String; function RecurseNumber(N: LongWord): string; begin case N of 1..19: Result := Numbers[N]; 20..99: begin if (N in [20,30,40,50,60,70,80,90]) then Result := Tenths[N div 10] else Result := Tenths[N div 10] +'-'+ RecurseNumber(N mod 10); end; 100..999: Result := Numbers[N div 100] + ' Hundred And ' + 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;} 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 {write like 'cents Twenty-five',If you want a result like 'Nought Point two five',you can use strings in {}} Result :=Result + ' And Cents '+ RecurseNumber(Round(Frac(Number)*100)) {Result :=Result +' Point '+ RecurseNumber(Round(Int(Frac(Number)*10)))+' '+RecurseNumber(Round(Int(Frac(Number*10)*10)))} else Result := Result +' Only'; end; if (Number >0) and (Number<Min) then begin if not(Frac(Number) = 0.00) then {write like 'cents Twenty-five',If you want a result like 'Nought Point two five',you can use strings in {}} Result :=Result + ' Cents '+ RecurseNumber(Round(Frac(Number)*100)); {Result :=Result +' Point '+ RecurseNumber(Round(Int(Frac(Number)*10)))+' '+RecurseNumber(Round(Int(Frac(Number*10)*10)))} end; end;{NumToLetters} end. |
||





