interface function sMoneyInWords( Nin: currency ): string; export; function szMoneyInWords( Nin: currency ): PChar; export; { Денежная сумма Nin в рублях и копейках прописью
1997, в.2.1, by О.В.Болдырев} implementation uses SysUtils,Dialogs,Math;
type
tri=string[4]; mood=1..2; gender=(m,f); uns =array[0..9] of string[7]; tns =array[0..9] of string[13]; decs=array[0..9] of string[12]; huns=array[0..9] of string[10]; nums=array[0..4] of string[8]; money=array[1..2] of string[5]; endings=array[gender,mood,1..3] of tri;{окончания числительных и денег} const
str: string; function EndingIndex(Arg: integer): integer; begin
if ((Arg div 10) mod 10) <> 1 then case (Arg mod 10) of 1: Result := 1; 2..4: Result := 2; else Result := 3; end else Result := 3;end;
function sMoneyInWords( Nin: currency ): string; { Число Nin прописью, как функция } var // str: string;
g: gender; //род Nr: comp; {целая часть числа} Fr: integer; {дробная часть числа} i,iTri,Order: longint; {триада}
procedure Triad; var iTri2: integer; un, de, ce :byte; //единицы, десятки, сотни
function GetDigit: byte; begin Result := iTri2 mod 10; iTri2 := iTri2 div 10; end;
begin iTri := trunc(Nr/IntPower(1000,i)); Nr := Nr - int( iTri*IntPower(1000,i)); iTri2:=iTri; if iTri > 0 then begin un := GetDigit; de := GetDigit; ce := GetDigit; if i=1 then g:=f else g:=m; {женского рода только тысяча}
str := TrimRight(str)+' '+Hundreds[ce]; if de = 1 then str := TrimRight(str)+' '+Teens[un] else begin str := TrimRight(str)+' '+Decades[de]; case g of m: str := TrimRight(str)+' '+Units[un]; f: str := TrimRight(str)+' '+UnitsF[un]; end; end;
if length(numericals[i]) > 1 then begin str := TrimRight(str)+' '+numericals[i]; str := TrimRight(str)+ends[g,1,EndingIndex(iTri)]; end; end; //triad is 0 ?
if i=0 then Exit; Dec(i); Triad; end; begin
str := ''; Nr := int( Nin ); Fr := round( Nin*100 + 0.00000001 ) mod 100; if Nr>0 then Order := trunc(Log10(Nr)/3) else begin str := 'ноль'; Order := 0 end; if Order > High(numericals) then raise Exception.Create('Слишком большое число для суммы прописью'); i:= Order; Triad; str := Format('%s %s%s %.2d %s%s', [Trim(str),RusMon[1],ends[m,2,EndingIndex(iTri)], Fr, RusMon[2],ends[f,2,EndingIndex(Fr)]]); str[1] := (ANSIUpperCase(copy(str,1,1)))[1]; str[Length(str)+1] := #0; Result := str;end;
function szMoneyInWords( Nin: currency ): PChar; begin