Вот еще одно решение, присланное Олегом Клюкач.
Code: |
unit Numinwrd;
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] ofstring[7]; tns = array[0..9] ofstring[13]; decs = array[0..9] ofstring[12]; huns = array[0..9] ofstring[10]; nums = array[0..4] ofstring[8]; money = array[1..2] ofstring[5]; endings = array[gender, mood, 1..3] of tri; {окончания числительных и денег}
const
units: uns = ('', 'один ', 'два ', 'три ', 'четыре ', 'пять ', 'шесть ', 'семь ', 'восемь ', 'девять '); unitsf: uns = ('', 'одна ', 'две ', 'три ', 'четыре ', 'пять ', 'шесть ', 'семь ', 'восемь ', 'девять '); teens: tns = ('десять ', 'одиннадцать ', 'двенадцать ', 'тринадцать ', 'четырнадцать ', 'пятнадцать ', 'шестнадцать ', 'семнадцать ', 'восемнадцать ', 'девятнадцать '); decades: decs = ('', 'десять ', 'двадцать ', 'тридцать ', 'сорок ', 'пятьдесят ', 'шестьдесят ', 'семьдесят ', 'восемьдесят ', 'девяносто '); hundreds: huns = ('', 'сто ', 'двести ', 'триста ', 'четыреста ', 'пятьсот ', 'шестьсот ', 'семьсот ', 'восемьсот ', 'девятьсот '); numericals: nums = ('', 'тысяч', 'миллион', 'миллиард', 'триллион'); RusMon: money = ('рубл', 'копе'); ends: endings = ((('', 'а', 'ов'), ('ь', 'я', 'ей')), (('а', 'и', ''), ('йка', 'йки', 'ек'))); threadvar
str: string;
function EndingIndex(Arg: integer): integer; begin
if ((Arg div10) mod10) <> 1then case (Arg mod10) 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 mod10; iTri2 := iTri2 div10; end;
begin iTri := trunc(Nr / IntPower(1000, i)); Nr := Nr - int(iTri * IntPower(1000, i)); iTri2 := iTri; if iTri > 0then begin un := GetDigit; de := GetDigit; ce := GetDigit; if i = 1then g := f else g := m; {женского рода только тысяча}
str := TrimRight(str) + ' ' + Hundreds[ce]; if de = 1then 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]) > 1then begin str := TrimRight(str) + ' ' + numericals[i]; str := TrimRight(str) + ends[g, 1, EndingIndex(iTri)]; end; end; //triad is 0 ?
if i = 0then Exit; Dec(i); Triad; end;
begin
str := ''; Nr := int(Nin); Fr := round(Nin * 100 + 0.00000001) mod100; if Nr > 0then 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
sMoneyInWords(Nin); Result := @(str[1]); end;
end. |
Взято из Советов по Delphi от Валентина Озерова
Сборник Kuliba
Просьба писать ваши замечания, наблюдения и все остальное,
что поможет улучшить предоставляемую информацию на этом сайте.
ВСЕ КОММЕНТАРИИ МОДЕРИРУЮТСЯ ВРУЧНУЮ, ТАК ЧТО СПАМИТЬ БЕСПОЛЕЗНО!