Содержание материала

 

 Вот еще одно решение, присланное Олегом Клюкач.

 

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

 

Добавить комментарий

Не использовать не нормативную лексику.

Просьба писать ваши замечания, наблюдения и все остальное,
что поможет улучшить предоставляемую информацию на этом сайте.

ВСЕ КОММЕНТАРИИ МОДЕРИРУЮТСЯ ВРУЧНУЮ, ТАК ЧТО СПАМИТЬ БЕСПОЛЕЗНО!


Защитный код
Обновить