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

Автор Александр

 

Code:

{------------------------ Деньги прописью ---------------------}

function TextSum(S: double): string;

 

function Conv999(M: longint; fm: integer): string;

const

 

c1to9m: array[1..9] ofstring[6] =

('один', 'два', 'три', 'четыре', 'пять', 'шесть', 'семь', 'восемь', 'девять');

c1to9f: array[1..9] ofstring[6] =

('одна', 'две', 'три', 'четыре', 'пять', 'шесть', 'семь', 'восемь', 'девять');

c11to19: array[1..9] ofstring[12] =

('одиннадцать', 'двенадцать', 'тринадцать', 'четырнадцать', 'пятнадцать',

'шестнадцать', 'семнадцать', 'восемнадцать', 'девятнадцать');

c10to90: array[1..9] ofstring[11] =

('десять', 'двадцать', 'тридцать', 'сорок', 'пятьдесят', 'шестьдесят',

'семьдесят', 'восемьдесят', 'девяносто');

c100to900: array[1..9] ofstring[9] =

('сто', 'двести', 'триста', 'четыреста', 'пятьсот', 'шестьсот', 'семьсот',

'восемьсот', 'девятьсот');

var

 

s: string;

i: longint;

begin

 

s := '';

i := M div100;

if i <> 0then s := c100to900[i] + ' ';

M := M mod100;

i := M div10;

if (M > 10) and (M < 20) then

s := s + c11to19[M - 10] + ' '

else

begin

if i <> 0then s := s + c10to90[i] + ' ';

M := M mod10;

if M <> 0then

if fm = 0then

s := s + c1to9f[M] + ' '

else

s := s + c1to9m[M] + ' ';

end;

Conv999 := s;

end;

 

{--------------------------------------------------------------}

var

 

i: longint;

j: longint;

r: real;

t: string;

 

begin

 

t := '';

 

j := Trunc(S / 1000000000.0);

r := j;

r := S - r * 1000000000.0;

i := Trunc(r);

if j <> 0then

begin

t := t + Conv999(j, 1) + 'миллиард';

j := j mod100;

if (j > 10) and (j < 20) then

t := t + 'ов '

else

case j mod10of

0: t := t + 'ов ';

1: t := t + ' ';

2..4: t := t + 'а ';

5..9: t := t + 'ов ';

end;

end;

 

j := i div1000000;

if j <> 0then

begin

t := t + Conv999(j, 1) + 'миллион';

j := j mod100;

if (j > 10) and (j < 20) then

t := t + 'ов '

else

case j mod10of

0: t := t + 'ов ';

1: t := t + ' ';

2..4: t := t + 'а ';

5..9: t := t + 'ов ';

end;

end;

 

i := i mod1000000;

j := i div1000;

if j <> 0then

begin

t := t + Conv999(j, 0) + 'тысяч';

j := j mod100;

if (j > 10) and (j < 20) then

t := t + ' '

else

case j mod10of

0: t := t + ' ';

1: t := t + 'а ';

2..4: t := t + 'и ';

5..9: t := t + ' ';

end;

end;

 

i := i mod1000;

j := i;

if j <> 0then t := t + Conv999(j, 1);

t := t + 'руб. ';

 

i := Round(Frac(S) * 100.0);

t := t + Long2Str(i) + ' коп.';

TextSum := t;

end;

 

 


 

 

Code:

unit RoubleUnit;

{$D Пропись © Близнец Антон '99 https:\\anton-bl.chat.ru\delphi\}

{ 1000011.01->'Один миллион одинадцать рублей 01 копейка' }

interface

function RealToRouble(c: Extended): string;

implementation

uses SysUtils, math;

const Max000 = 6; {Кол-во триплетов - 000}

MaxPosition = Max000 * 3; {Кол-во знаков в числе }

//Аналог IIF в Dbase есть в proc.pas для основных типов, частично объявлена тут для независимости

function IIF(i: Boolean; s1, s2: Char): Char; overload; beginif i then

result := s1

else

result := s2 end;

function IIF(i: Boolean; s1, s2: string): string; overload; beginif i then

result := s1

else

result := s2 end;

 

function NumToStr(s: string): string; {Возвращает число прописью}

const c1000: array[0..Max000] ofstring = ('', 'тысяч', 'миллион', 'миллиард', 'триллион', 'квадраллион', 'квинтиллион');

 

c1000w: array[0..Max000] of Boolean = (False, True, False, False, False, False, False);

w: array[False..True, '0'..'9'] ofstring[3] = (('ов ', ' ', 'а ', 'а ', 'а ', 'ов ', 'ов ', 'ов ', 'ов ', 'ов '),

(' ', 'а ', 'и ', 'и ', 'и ', ' ', ' ', ' ', ' ', ' '));

function Num000toStr(S: string; woman: Boolean): string; {Num000toStr возвращает число для триплета}

const c100: array['0'..'9'] ofstring = ('', 'сто ', 'двести ', 'триста ', 'четыреста ', 'пятьсот ', 'шестьсот ', 'семьсот ', 'восемьсот ', 'девятьсот ');

c10: array['0'..'9'] ofstring = ('', 'десять ', 'двадцать ', 'тридцать ', 'сорок ', 'пятьдесят ', 'шестьдесят ', 'семьдесят ', 'восемьдесят ', 'девяносто ');

c11: array['0'..'9'] ofstring = ('', 'один', 'две', 'три', 'четыр', 'пят', 'шест', 'сем', 'восем', 'девят');

c1: array[False..True, '0'..'9'] ofstring = (('', 'один ', 'два ', 'три ', 'четыре ', 'пять ', 'шесть ', 'семь ', 'восемь ', 'девять '),

('', 'одна ', 'две ', 'три ', 'четыре ', 'пять ', 'шесть ', 'семь ', 'восемь ', 'девять '));

begin{Num000toStr}

Result := c100[s[1]] + iif((s[2] = '1') and (s[3] > '0'), c11[s[3]] + 'надцать ', c10[s[2]] + c1[woman, s[3]]);

end; {Num000toStr}

 

var s000: string[3];

 

isw, isMinus: Boolean;

i: integer; //Счётчик триплетов

begin

 

Result := ''; i := 0;

isMinus := (s <> '') and (s[1] = '-');

if isMinus then s := Copy(s, 2, Length(s) - 1);

whilenot ((i >= Ceil(Length(s) / 3)) or (i >= Max000)) do

begin

s000 := Copy('00' + s, Length(s) - i * 3, 3);

isw := c1000w[i];

if (i > 0) and (s000 <> '000') then//тысячи и т.д.

Result := c1000[i] + w[Isw, iif(s000[2] = '1', '0', s000[3])] + Result;

Result := Num000toStr(s000, isw) + Result;

Inc(i)

end;

if Result = ''then Result := 'ноль';

if isMinus then Result := 'минус ' + Result;

end; {NumToStr}

 

function RealToRouble(c: Extended): string;

 

const ruble: array['0'..'9'] ofstring[2] = ('ей', 'ь', 'я', 'я', 'я', 'ей', 'ей', 'ей', 'ей', 'ей');

Kopeek: array['0'..'9'] ofstring[3] = ('ек', 'йка', 'йки', 'йки', 'йки', 'ек', 'ек', 'ек', 'ек', 'ек');

 

function ending(const s: string): Char;

var l: Integer; //С l на 8 байт коротче $50->$48->$3F

begin//Возвращает индекс окончания

l := Length(s);

Result := iif((l > 1) and (s[l - 1] = '1'), '0', s[l]);

end;

 

var rub: string[MaxPosition + 3]; kop: string[2];

begin{Возвращает число прописью с рублями и копейками}

 

Str(c: MaxPosition + 3: 2, Result);

if Pos('E', Result) = 0then//Если число можно представить в строке <>1E+99

begin

rub := TrimLeft(Copy(Result, 1, Length(Result) - 3));

kop := Copy(Result, Length(Result) - 1, 2);

Result := NumToStr(rub) + ' рубл' + ruble[ending(rub)]

+ ' ' + kop + ' копе' + Kopeek[ending(kop)];

Result := AnsiUpperCase(Result[1]) + Copy(Result, 2, Length(Result) - 1);

end;

end;

end.

 


 

 

 Редянов Денис

 

Code:

function CifrToStr(Cifr: string; Pr: Integer; Padeg: Integer): string;

{Функция возвращает прописью 1 цифры признак 3-единицы 2-десятки 1-сотни 4-11-19

 

Padeg - 1-нормально 2- одна, две }

var i: Integer;

begin

 

i := StrToInt(Cifr);

if Pr = 1then

case i of

1: CifrToStr := 'сто';

2: CifrToStr := 'двести';

3: CifrToStr := 'триста';

4: CifrToStr := 'четыреста';

5: CifrToStr := 'пятьсот';

6: CifrToStr := 'шестьсот';

7: CifrToStr := 'семьсот';

8: CifrToStr := 'восемьсот';

9: CifrToStr := 'девятьсот';

0: CifrToStr := '';

end

elseif Pr = 2then

case i of

1: CifrToStr := '';

2: CifrToStr := 'двадцать';

3: CifrToStr := 'тридцать';

4: CifrToStr := 'сорок';

5: CifrToStr := 'пятьдесят';

6: CifrToStr := 'шестьдесят';

7: CifrToStr := 'семьдесят';

8: CifrToStr := 'восемьдесят';

9: CifrToStr := 'девяносто';

0: CifrToStr := '';

end

elseif Pr = 3then

case i of

1: if Padeg = 1then

CifrToStr := 'один'

else

CifrToStr := 'одна';

2: if Padeg = 1then

CifrToStr := 'два'

else

CifrToStr := 'две';

3: CifrToStr := 'три';

4: CifrToStr := 'четыре';

5: CifrToStr := 'пять';

6: CifrToStr := 'шесть';

7: CifrToStr := 'семь';

8: CifrToStr := 'восемь';

9: CifrToStr := 'девять';

0: CifrToStr := '';

end

elseif Pr = 4then

case i of

1: CifrToStr := 'одиннадцать';

2: CifrToStr := 'двенадцать';

3: CifrToStr := 'тринадцать';

4: CifrToStr := 'четырнадцать';

5: CifrToStr := 'пятнадцать';

6: CifrToStr := 'шестнадцать';

7: CifrToStr := 'семнадцать';

8: CifrToStr := 'восемнадцать';

9: CifrToStr := 'девятнадцать';

0: CifrToStr := 'десять';

 

end;

end;

 

function Rasryad(K: Integer; V: string): string;

{Функция возвращает наименование разряда в зависимости от последних 2 цифр его}

var j: Integer;

begin

 

j := StrToInt(Copy(v, Length(v), 1));

if (StrToInt(Copy(v, Length(v) - 1, 2)) > 9) and (StrToInt(Copy(v, Length(v) - 1, 2)) < 20) then

case K of

0: Rasryad := '';

1: Rasryad := 'тысяч';

2: Rasryad := 'миллионов';

3: Rasryad := 'миллиардов';

4: Rasryad := 'триллионов';

end

else

case K of

0: Rasryad := '';

1: case j of

1: Rasryad := 'тысяча';

2..4: Rasryad := 'тысячи';

else

Rasryad := 'тысяч';

end;

2: case j of

1: Rasryad := 'миллион';

2..4: Rasryad := 'миллионa';

else

Rasryad := 'миллионов';

end;

3: case j of

1: Rasryad := 'миллиард';

2..4: Rasryad := 'миллиарда';

else

Rasryad := 'миллиардов';

end;

4: case j of

1: Rasryad := 'триллион';

2..4: Rasryad := 'триллиона';

else

Rasryad := 'триллионов';

end;

end;

end;

 

function GroupToStr(Group: string; Padeg: Integer): string;

{Функция возвращает прописью 3 цифры}

var i: Integer;

 

S: string;

begin

 

S := '';

if (StrToInt(Copy(Group, Length(Group) - 1, 2)) > 9) and (StrToInt(Copy(Group, Length(Group) - 1, 2)) < 20) then

begin

if Length(Group) = 3then

S := S + ' ' + CifrToStr(Copy(Group, 1, 1), 1, Padeg);

S := S + ' ' + CifrToStr(Copy(Group, Length(Group), 1), 4, Padeg);

end

else

for i := 1to Length(Group) do

S := S + ' ' + CifrToStr(Copy(Group, i, 1), i - Length(Group) + 3, Padeg);

GroupToStr := S;

end;

 

{Функция возвращает сумму прописью}

function RubToStr(Rubs: Currency; Rub, Kop: string): string;

var i, j: Integer;

 

R, K, S: string;

begin

 

S := CurrToStr(Rubs);

S := Trim(S);

if Pos(',', S) = 0then

begin

R := S;

K := '00';

end

else

begin

R := Copy(S, 0, (Pos(',', S) - 1));

K := Copy(S, (Pos(',', S) + 1), Length(S));

end;

 

S := '';

i := 0;

j := 1;

while Length(R) > 3do

begin

if i = 1then

j := 2

else

j := 1;

S := GroupToStr(Copy(R, Length(R) - 2, 3), j) + ' ' + Rasryad(i, Copy(R, Length(R) - 2, 3)) + ' ' + S;

R := Copy(R, 1, Length(R) - 3);

i := i + 1;

end;

if i = 1then

j := 2

else

j := 1;

S := Trim(GroupToStr(R, j) + ' ' + Rasryad(i, R) + ' ' + S + ' ' + Rub + ' ' + K + ' ' + Kop);

S := ANSIUpperCase(Copy(S, 1, 1)) + Copy(S, 2, Length(S) - 1);

RubToStr := S;

end;

 

 


 

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

 

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

 


 

Code:

unit FullSum;

 

interface

 

uses SysUtils;

 

{

Функция перевода суммы, записанной цифрами в сумму прописью :

например, 23.12 -> двадцать три рубля 12 копеек.

переводит до 999999999 руб. 99 коп.

Функция не отслеживает, правильное ли значение получено в параметре Number

(т.е. положительное и округленное с точностью до сотых) - эту проверку

необходимо провести до вызова функции.

}

 

//----------------- Copyright (c) 1999 by Константин Егоров

//----------------- mailto: egor vladi.elektra

 

function SumNumToFull(Number: real): string;

 

implementation

 

function SumNumToFull(Number:real):string;

var

PartNum, TruncNum, NumTMP, D: integer;

NumStr : string;

i, R : byte;

Flag11 : boolean;

begin

D:=1000000;

R:=4;

//выделяем рубли

TruncNum:=Trunc(Number);

if TruncNum<>0then

repeat

PartNum:=TruncNum div D;

Dec(R);

D:=D div1000;

until

PartNum<>0

else

R:=0;

 

// перевод рублей

for i:=R downto1do

begin

Flag11:=False;

// выделение цифры сотен

NumTMP:=PartNum div100;

case NumTMP of

1: NumStr:=NumStr+'сто ';

2: NumStr:=NumStr+'двести ';

3: NumStr:=NumStr+'триста ';

4: NumStr:=NumStr+'четыреста ';

5: NumStr:=NumStr+'пятьсот ';

6: NumStr:=NumStr+'шестьсот ';

7: NumStr:=NumStr+'семьсот ';

8: NumStr:=NumStr+'восемьсот ';

9: NumStr:=NumStr+'девятьсот ';

end;

// выделение цифры десятков

NumTMP:=(PartNum mod100) div10;

case NumTMP of

1:

begin

NumTMP:=PartNum mod100;

case NumTMP of

10: NumStr:=NumStr+'десять ';

11: NumStr:=NumStr+'одиннадцать ';

12: NumStr:=NumStr+'двенадцать ';

13: NumStr:=NumStr+'тринадцать ';

14: NumStr:=NumStr+'четырнадцать ';

15: NumStr:=NumStr+'пятнадцать ';

16: NumStr:=NumStr+'шестнадцать ';

17: NumStr:=NumStr+'семнадцать ';

18: NumStr:=NumStr+'восемнадцать ';

19: NumStr:=NumStr+'девятнадцать ';

end;

case i of

3: NumStr:=NumStr+'миллионов ';

2: NumStr:=NumStr+'тысяч ';

1: NumStr:=NumStr+'рублей ';

end;

Flag11:=True;

end;

2: NumStr:=NumStr+'двадцать ';

3: NumStr:=NumStr+'тридцать ';

4: NumStr:=NumStr+'сорок ';

5: NumStr:=NumStr+'пятьдесят ';

6: NumStr:=NumStr+'шестьдесят ';

7: NumStr:=NumStr+'семьдесят ';

8: NumStr:=NumStr+'восемьдесят ';

9: NumStr:=NumStr+'девяносто ';

end;

// выделение цифры единиц

NumTMP:=PartNum mod10;

ifnot Flag11 then

begin

case NumTMP of

1:

if i=2then

NumStr:=NumStr+'одна '

else

NumStr:=NumStr+'один ';

2:

if i=2then

NumStr:=NumStr+'две '

else

NumStr:=NumStr+'два ';

3: NumStr:=NumStr+'три ';

4: NumStr:=NumStr+'четыре ';

5: NumStr:=NumStr+'пять ';

6: NumStr:=NumStr+'шесть ';

7: NumStr:=NumStr+'семь ';

8: NumStr:=NumStr+'восемь ';

9: NumStr:=NumStr+'девять ';

end;

case i of

3:

case NumTMP of

1: NumStr:=NumStr+'миллион ';

2,3,4: NumStr:=NumStr+'миллиона ';

else

NumStr:=NumStr+'миллионов ';

end;

2:

case NumTMP of

1 : NumStr:=NumStr+'тысяча ';

2,3,4: NumStr:=NumStr+'тысячи ';

else

if PartNum<>0then

NumStr:=NumStr+'тысяч ';

end;

1:

case NumTMP of

1 : NumStr:=NumStr+'рубль ';

2,3,4: NumStr:=NumStr+'рубля ';

else

NumStr:=NumStr+'рублей ';

end;

end;

end;

if i>1then

begin

PartNum:=(TruncNum mod (D*1000)) div D;

D:=D div1000;

end;

end;

 

//перевод копеек

PartNum:=Round(Frac(Number)*100);

if PartNum=0then

begin

SumNumToFull:=NumStr+'00 копеек';

Exit;

end;

// выделение цифры десятков

NumTMP:=PartNum div10;

if NumTMP=0then

NumStr:=NumStr+'0'+IntToStr(PartNum)+' '

else

NumStr:=NumStr+IntToStr(PartNum)+' ';

// выделение цифры единиц

NumTMP:=PartNum mod10;

case NumTMP of

1:

if PartNum<>11then

NumStr:=NumStr+'копейка'

else

NumStr:=NumStr+'копеек';

2,3,4:

if (PartNum<5) or (PartNum>14) then

NumStr:=NumStr+'копейки'

else

NumStr:=NumStr+'копеек';

else

NumStr:=NumStr+'копеек';

end;

SumNumToFull:=NumStr;

end;

 

end.

 

 

https://delphiworld.narod

DelphiWorld 6.0


 

 

Code:

{ Преобразует трехзначное число в строку }

function ConvertToWord(N: word): string;

const

Sot : array[1..9] ofstring[13] =

('сто','двести','триста','четыреста','пятьсот',

'шестьсот','семьсот','восемьсот','девятьсот');

 

Des : array[2..9] ofstring[13] =

('двадцать','тридцать','сорок','пятьдесят',

'шестьдесят','семьдесят','восемьдесят','девяносто');

 

Edin : array[0..19] ofstring[13] =

('','один','два','три','четыре','пять','шесть','семь',

'восемь','девять','десять','одиннадцать','двенадцать',

'тринадцать','четырнадцать','пятнадцать',

'шестнадцать','семнадцать','восемнадцать','девятнадцать');

 

var

S: string;

begin

S:='';

N:=N mod1000;

if N>99then

begin

S:=Sot[N div100]+' ';

N:=N mod100;

end;

if N>19then

begin

S:=S+Des[N div10]+' ';

N:=N mod10;

end;

Result:=S+Edin[N];

end;

 

{ Возвращает сумму прописью }

function CenaToStr(r: Currency): string;

var

N, k: longint;

S: string;

begin

N:=trunc(R); S:='';

if N<>0then

begin

if N>999999then

begin

k:=N div1000000;

S:=ConvertToWord(k);

if ((k-(k div100)*100)>10) and ((k-(k div100)*100)<20) then

S:=S+' миллионов'

else

if (k mod10)=1then

S:=S+' миллион'

else

if ((k mod10)>=2)and((k mod10)<=4) then

S:=S+' миллиона'

else

S:=S+' миллионов';

N:=N mod1000000;

end;

if N>999then

begin

k:=N div1000;

S:=S+' '+ConvertToWord(k);

if ((k-(k div100)*100)>10)and((k-(k div100)*100)<20) then

S:=S+' тысяч'

else

if (k mod10)=1then

begin

SetLength(S, Length(S)-2);

S:=S+'на тысяча';

end

else

if (k mod10)=2then

begin

SetLength(S, length(S)-1);

S:=S+'е тысячи';

end

else

if ((k mod10)>=3)and((k mod10)<=4) then

S:=S+' тысячи'

else

S:=S+' тысяч';

N:=N mod1000;

end;

k:=N;

S:=S+' '+ConvertToWord(k);

if ((k-(k div100)*100)>10)and((k-(k div100)*100)<20) then

S:=S+' рублей'

else

if (k mod10)=1then

S:=S+' рубль'

else

if (k mod10)=2then

S:=S+' рубля'

else

if ((k mod10)>=3)and((k mod10)<=4) then

S:=S+' рубля'

else

S:=S+' рублей';

end;

if trunc(R)<>R then

begin

k:=round(frac(R)*100);

S:=S+' '+IntToStr(K);

if ((k-(k div100)*100)>10)and((k-(k div100)*100)<20) then

S:=S+' копеек'

else

if (k mod10)=1then

begin

S:=S+' копейка';

end

else

if (k mod10)=2then

begin

S:=S+' копейки';

end

else

if ((k mod10)>=3)and((k mod10)<=4) then

S:=S+' копейки'

else

S:=S+' копеек';

end

else

S:=S+' 00 копеек';

S:=Trim(S);

if S<>''then

S[1]:=AnsiUpperCase(S[1])[1];

result:=S;

end;

 

 

 

https://delphiworld.narod

DelphiWorld 6.0

 


 

Code:

{ **** UBPFD *********** by delphibase.endimus ****

>> Сумма прописью

 

Данный набор функций позволяет из суммы в числовом виде получить

её представление прописью. Реализована возможность работы с рублями и долларами.

Возможно добавление какой угодно валюты.

 

Зависимости: SysUtils

Автор: fnatali, fnatali yandex.ru, Березники

Copyright: Евгений Меньшенин <johnmen mail.ru>

Дата: 27 апреля 2002 г.

***************************************************** }

 

unit SpellingD;

 

interface

 

uses SysUtils;

 

function SpellPic(StDbl: double; StSet: integer): string;

 

implementation

 

const

Money: array[0..1] ofstring[25] =

('ь я рубл ей коп. ',

'р ра долларов цент.');

{А Б В Г Д Е Ж З И Й К Л М Н О

П Р С Т У Ф Х Ц Ч Ш Щ Ъ Ы Ь

Э Ю Я а б в г д }

Sym: string[180] =

'одна две один два три четыре пят ь шест сем восемдевятдесят'

+ 'на дцатьсорокдевяно сто сти ста ьсот тысяча и миллион '

+ 'ов ард ноль ь я рубл ей коп. ';

Code: string[156] =

 

'БААВААГААДААЕААЖЗАИЙАКЙАЛЙАМЙАНЙАОЙАГПРВПРЕПРЖПРИПРКПРЛПРМПРНПРДРАЕРА'

+

'СААИЙОКЙОЛЙОМЙОТУФФААВХАЕЦАЖЗЦИЧАКЧАЛЧАМЧАНЧАваАвбАвгАШЩАШЪАШААЫЬАЫЬЩ'

+ 'ЫЬЭЫЮАЫЮЩЫЮЭЯААдАА';

{1 2 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 30

40 50 60 70 80 90 1 2 3 4 5 6 7 8 9 РУБ -Я-ЕЙТЫС -И -ЧМ-Н-А

-ВМ-Д -А -В0 коп}

{0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22

23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45

46 47 48 49 50 51 }

 

function SpellPic(StDbl: double; StSet: integer): string;

{format of StNum: string[15]= 000000000000.00}

const

StMask = '000000000000.00';

var

StNum: string; {StDbl -> StNum}

PlaceNo: integer; {текущая позиция в StNum}

TripletNo: integer; {позиция имени обрабатываемого разряда (им.п.ед.ч.)}

StWord: string; {результат}

 

procedure WordAdd(CodeNo: integer);

var

SymNo: integer; {текущая позиция в массиве Sym}

i, j: integer;

begin

;

Inc(CodeNo, CodeNo shl1); {* 3}

for i := 1to3do

begin

;

Inc(CodeNo);

SymNo := ord(Code[CodeNo]) - ord('Б');

if SymNo < 0then

break;

Inc(SymNo, SymNo shl2); {* 5}

for j := 1to5do

begin

;

Inc(SymNo);

if Sym[SymNo] = ' 'then

break;

StWord := StWord + Sym[SymNo];

end;

end;

StWord := StWord + ' ';

end;

 

procedure Triplet;

var

D3: integer; {сотни текущего разряда}

D2: integer; {десятки текущего разряда}

D1: integer; {единицы текущего разряда}

TripletPos: integer; {смещение имени разряда для разных падежей}

begin

;

Inc(PlaceNo);

D3 := ord(StNum[PlaceNo]) - ord('0');

Inc(PlaceNo);

D2 := ord(StNum[PlaceNo]) - ord('0');

Inc(PlaceNo);

D1 := ord(StNum[PlaceNo]) - ord('0');

Dec(TripletNo, 3);

TripletPos := 2; {рублей (род.п.мн.ч.)}

if D3 > 0then

WordAdd(D3 + 28);

{сотни}

if D2 = 1then

WordAdd(D1 + 11)

{10-19}

else

begin

;

if D2 > 1then

WordAdd(D2 + 19);

{десятки}

if D1 > 0then

begin

;

{единицы}

if (TripletNo = 41) and (D1 < 3) then

WordAdd(D1 - 1) {одна или две тысячи}

else

WordAdd(D1 + 1);

if D1 < 5then

TripletPos := 1; {рубля (род.п.ед.ч.)}

if D1 = 1then

TripletPos := 0; {рубль (им.п.ед.ч.)}

end;

end;

if (TripletNo = 38) and (Length(StWord) = 0) then

WordAdd(50); {ноль целых}

if (TripletNo = 38) or (D1 + D2 + D3 > 0) then{имя разряда}

WordAdd(TripletNo + TripletPos);

end;

 

var

i: integer;

begin

;

Move(Money[StSet, 1], Sym[156], 25);

StNum := FormatFloat(StMask, StDbl);

 

PlaceNo := 0;

TripletNo := 50;

{47+3}

StWord := ''; {будущий результат}

 

for i := 1to4do

Triplet; {4 разряда: миллиарды, миллионы, тысячи,единицы}

StWord := StWord + StNum[14] + StNum[15] + ' ';

WordAdd(51);

 

{Upcase первая буква}

SpellPic := AnsiUpperCase(StWord[1]) + Copy(StWord, 2, Length(StWord) - 2);

end;

 

end.

Пример использования:

 

var

sumpr: string;

begin

// первый параметр - сумма, которую необходимо перевести в пропись,

// второй параметр - валюта (0-рубли, 1- доллары).

sumpr := spellpic(100, 0);

...

 

 

https://delphiworld.narod

DelphiWorld 6.0

 

 


 

Code:

{ **** UBPFD *********** by delphibase.endimus ****

>> Преобразование целого числа 0-999999999 в строку (прописью)

 

Я думаю, всё итак понятно, что не понятно пишите письма

 

Зависимости: SysUtils

Автор: Алексей, ARojkov okil.ru, СПб

Copyright: b0b

Дата: 12 марта 2004 г.

***************************************************** }

 

unit UIntToStroka;

 

interface

 

uses SysUtils;

 

const

N1: array[0..9] ofstring = ('ноль',

'один',

'два',

'три',

'четыре',

'пять',

'шесть',

'семь',

'восемь',

'девять');

 

const

N1000: array[1..9] ofstring = ('одна',

'две',

'три',

'четыре',

'пять',

'шесть',

'семь',

'восемь',

'девять');

 

const

N11: array[0..9] ofstring = ('десять',

'одиннадцать',

'двенадцать',

'тринадцать',

'четырнадцать',

'пятнадцать',

'шестнадцать',

'семнадцать',

'восемнадцать',

'девятнадцать');

 

const

N2: array[1..9] ofstring = ('десять',

'двадцать',

'тридцать',

'сорок',

'пятьдесят',

'шестьдесят',

'семьдесят',

'восемьдесят',

'девяносто'

);

 

const

N3: array[1..9] ofstring = ('сто',

'двести',

'триста',

'четыреста',

'пятьсот',

'шестьсот',

'семьсот',

'восемьсот',

'девятьсот'

);

 

const

NThousand: array[1..3] ofstring = ('тысяча ',

'тысячи ',

'тысяч ');

 

const

NMillion: array[1..3] ofstring = ('миллион ',

'миллиона ',

'миллионов ');

 

function IntToStroka(n: Integer): AnsiString;

 

implementation

 

function IntToStroka(n: Integer): AnsiString;

var

i, j, dec, j0: Integer;

s: string;

degt, degm: boolean;

buf: string;

begin

degt := false;

degm := false;

s := IntToStr(n);

Result := '';

for i := length(s) downto1do

begin

dec := (length(s) - i + 1); // получим разряд

j := StrToInt(s[i]); // получим цифру

 

if j = 0then

j0 := 0;

if (not (j in [1..9])) and (dec <> 1) then

Continue;

 

if Dec in [1, 4, 7, 10] then

try

if StrToInt(s[i - 1]) = 1then

begin

j0 := j;

Continue;

end; // подготовка к 10..19 тысяч/миллионов

except

end;

 

if Dec in [2, 5, 8, 11] then

if j = 1then

begin

case dec of

2: Result := N11[j0] + ' '; // если 10..19 тысяч/миллионов

5:

begin

Result := N11[j0] + ' ' + NThousand[3] + Result;

degt := true;

end;

8:

begin

Result := N11[j0] + ' ' + NMillion[3] + Result;

degm := true;

end;

end;

Continue;

end;

 

if DEC in [4..6] then

begin

if (j <> 0) and (not degt) then

begin

if dec = 4then

case j of

1: buf := NThousand[1];

2..4: buf := NThousand[2];

// прибавим слово тысяча если ещё не добавляли

5..9: buf := NThousand[3];

end

else

buf := NThousand[3];

degt := true;

end;

end;

 

if DEC in [7..9] then

begin

if (j <> 0) and (not degm) then

begin

if dec = 7then

case j of

1: buf := NMillion[1];

2..4: buf := NMillion[2];

// прибавим слово миллион если ещё не добавляли

5..9: buf := NMillion[3];

end

else

buf := NMillion[3];

degm := true;

end;

end;

 

Result := buf + Result;

 

while dec > 3do

dec := dec - 3;

 

case Dec of

1: if j <> 0then

if degt and (not degm) then

Result := N1000[j] + ' ' + Result

else

Result := N1[j] + ' ' + Result; // 3 три

2: Result := N2[j] + ' ' + Result; // 23 двадцать три

3: Result := N3[j] + ' ' + Result; // 123 сто двадцать три

end;

Buf := '';

j0 := j;

end;

end;

 

end.

 

 


 

Code:

function NumToStr(n: double; c: byte = 0): string;

(*

 

c=0 - 21.05 -> 'Двадцать один рубль 05 копеек.'

с=1 - 21.05 -> 'двадцать один'

c=2 - 21.05 -> '21-05', 21.00 -> '21='

*)

const

 

digit: array[0..9] ofstring = ('ноль', 'оди', 'два', 'три', 'четыр',

'пят', 'шест', 'сем', 'восем', 'девят');

var

 

ts, mln, mlrd, SecDes: Boolean;

len: byte;

summa: string;

 

function NumberString(number: string): string;

var

d, pos: byte;

 

function DigitToStr: string;

begin

result := '';

if (d <> 0) and ((pos = 11) or (pos = 12)) then

mlrd := true;

if (d <> 0) and ((pos = 8) or (pos = 9)) then

mln := true;

if (d <> 0) and ((pos = 5) or (pos = 6)) then

ts := true;

if SecDes then

begin

case d of

0: result := 'десять ';

2: result := 'двенадцать '

else

result := digit[d] + 'надцать '

end;

case pos of

4: result := result + 'тысяч ';

7: result := result + 'миллионов ';

10: result := result + 'миллиардов '

end;

SecDes := false;

mln := false;

mlrd := false;

ts := false

end

else

begin

if (pos = 2) or (pos = 5) or (pos = 8) or (pos = 11) then

case d of

1: SecDes := true;

2, 3: result := digit[d] + 'дцать ';

4: result := 'сорок ';

9: result := 'девяносто ';

5..8: result := digit[d] + 'ьдесят '

end;

if (pos = 3) or (pos = 6) or (pos = 9) or (pos = 12) then

case d of

1: result := 'сто ';

2: result := 'двести ';

3: result := 'триста ';

4: result := 'четыреста ';

5..9: result := digit[d] + 'ьсот '

end;

if (pos = 1) or (pos = 4) or (pos = 7) or (pos = 10) then

case d of

1: result := 'один ';

2, 3: result := digit[d] + ' ';

4: result := 'четыре ';

5..9: result := digit[d] + 'ь '

end;

if pos = 4then

begin

case d of

0: if ts then

result := 'тысяч ';

1: result := 'одна тысяча ';

2: result := 'две тысячи ';

3, 4: result := result + 'тысячи ';

5..9: result := result + 'тысяч '

end;

ts := false

end;

if pos = 7then

begin

case d of

0: if mln then

result := 'миллионов ';

1: result := result + 'миллион ';

2, 3, 4: result := result + 'миллиона ';

5..9: result := result + 'миллионов '

end;

mln := false

end;

if pos = 10then

begin

case d of

0: if mlrd then

result := 'миллиардов ';

1: result := result + 'миллиард ';

2, 3, 4: result := result + 'миллиарда ';

5..9: result := result + 'миллиардов '

end;

mlrd := false

end

end

end;

 

begin

result := '';

ts := false;

mln := false;

mlrd := false;

SecDes := false;

len := length(number);

if (len = 0) or (number = '0') then

result := digit[0]

else

for pos := len downto1do

begin

d := StrToInt(copy(number, len - pos + 1, 1));

result := result + DigitToStr

end

end;

 

function MoneyString(number: string): string;

var

s: string[1];

n: string;

begin

len := length(number);

n := copy(number, 1, len - 3);

result := NumberString(n);

s := AnsiUpperCase(result[1]);

delete(result, 1, 1);

result := s + result;

if len < 2then

begin

if len = 0then

n := '0';

len := 2;

n := '0' + n

end;

if copy(n, len - 1, 1) = '1'then

result := result + 'рублей'

else

begin

case StrToInt(copy(n, len, 1)) of

1: result := result + 'рубль';

2, 3, 4: result := result + 'рубля'

else

result := result + 'рублей'

end

end;

len := length(number);

n := copy(number, len - 1, len);

if copy(n, 1, 1) = '1'then

n := n + ' копеек.'

else

begin

case StrToInt(copy(n, 2, 1)) of

1: n := n + ' копейка.';

2, 3, 4: n := n + ' копейки.'

else

n := n + ' копеек.'

end

end;

result := result + ' ' + n

end;

 

// Основная часть

begin

 

case c of

0: result := MoneyString(FormatFloat('0.00', n));

1: result := NumberString(FormatFloat('0', n));

2:

begin

summa := FormatFloat('0.00', n);

len := length(summa);

if copy(summa, len - 1, 2) = '00'then

begin

delete(summa, len - 2, 3);

result := summa + '='

end

else

begin

delete(summa, len - 2, 1);

insert('-', summa, len - 2);

result := summa;

end;

end

end;

end;

 

 

https://delphiworld.narod

DelphiWorld 6.0

 


 

Честно, давно ждал подобного журнала в электронном виде. Решил послать своё творчество которое уже немало отработало, опять же, преобразование числа в пропись, отличающееся от опубликованных программок тем, что слова для прописи хранятся в отдельном файле (lang.cnf), по аналогии с подуктами 1C. Это позволяет изменять национальную валюту.

 

Если поэкспериментировать, с массивом Univer, в котором хранятся окончания, можно добиться преобразования для многих языков, не сказал ли я чего лишнего. :)

 

Надеюсь, моя версия Вам понравится.

 

С наилучшими пожеланиями,

 

Панченко Сергей

 

Казахстан, Алматы,

 

Code:

unit BuchUtil;

 

interface

 

uses IniFiles, SysUtils;

 

function DoubleChar(ch: string): string;

function NumToSampl(N: string): string;

function MoneyToSampl(M: Currency): string;

procedure LexemsToDim(fstr: string; var dim: arrayofstring);

 

var

 

NameNum: array[0..9, 1..4] ofstring; //массив им?н чисел

Ext: array[0..4, 1..3] ofstring; //массив расшиений (тысячи, миллионы ...)

Univer: array[1..9, 1..4] of integer; //массив окончаний

Rubl: array[1..3] ofstring; //массив имен рублей

Cop: array[1..3] ofstring; //массив имен копеек

Zero: string; //название нуля

One: string; //единица "одна"

Two: string; //двойка "две"

fFile: TIniFile; //файл, откуда загружается пропись

fString: string;

fDim: array[0..9] ofstring;

i: integer;

 

implementation

 

{заполняет массив Dim лексемами}

 

procedure LexemsToDim(fstr: string; var dim: arrayofstring);

var

 

i, j: integer;

flex: string;

begin

 

if Length(fstr) > 0then

begin

i := 1;

j := 0;

while i - 1 < Length(fstr) do

begin

if fstr[i] = ','then

begin

dim[j] := flex + ' ';

inc(j);

flex := '';

end

else

flex := flex + fstr[i];

inc(i);

end;

end;

end;

 

{преобразует число в пропись

 

процедура использует файл lang.cnf}

 

function NumToSampl(N: string): string;

var

 

k, i, i_indx: integer;

number, string_num: string;

index: integer;

pos: integer;

fl_ext: boolean;

begin

 

fl_ext := true;

i := 1;

String_num := '';

number := Trim(N);

k := length(number);

if (k = 1) and (number = '0') then

String_num := Zero

else

begin

 

pos := 0;

while (k > 0) do

begin

if (k <> 1) and (i = 1) and (length(number) <> 1) and (copy(number, k - 1,

1) = '1')

and (copy(number, k, 1) <> '0') then

begin

index := StrToInt(copy(number, k, 1));

dec(k);

inc(i);

i_indx := 4;

end

else

begin

index := StrToInt(copy(number, k, 1));

i_indx := i;

end;

if (NameNum[index, i_indx] <> '') and (fl_ext = true) then

begin

String_num := Ext[pos, Univer[index, i_indx]] + String_num;

fl_ext := false;

end;

 

if (index = 1) and (pos = 1) and (i = 1) then

String_num := One + String_num

elseif (index = 2) and (pos = 1) and (i = 1) then

String_num := Two + String_num

else

String_num := NameNum[index, i_indx] + String_num;

inc(i);

if i = 4then

begin

i := 1;

inc(pos);

fl_ext := true

end;

dec(k);

end;

end;

 

if Trim(String_Num) <> ''then

begin

String_num[1] := CHR(ORD(String_num[1]) - 32);

Result := String_num;

end;

end;

 

{Преобразует х в 0х}

 

function DoubleChar(ch: string): string;

begin

 

if Length(ch) = 1then

Result := '0' + ch

else

Result := ch;

end;

 

{преобразует денежную сумму в пропись}

 

function MoneyToSampl(M: Currency): string;

var

 

Int_Part, idx, idxIP, idxRP: integer;

Int_Str, Real_Part, Sampl: string;

begin

 

Int_Part := Trunc(Int(M));

Int_Str := IntToStr(Int_Part);

Real_Part := DoubleChar(IntToStr(Trunc(Int((M - Int_Part + 0.001) * 100))));

Sampl := NumToSampl(Int_Str);

idx := StrToInt(Int_Str[Length(Int_Str)]);

if idx = 0then

idx := 5;

idxIP := Univer[idx, 1];

idx := StrToInt(Real_Part[Length(Real_Part)]);

if idx = 0then

idx := 5;

idxRP := Univer[idx, 1];

Result := Sampl + Rubl[idxIP] + Real_Part + ' ' + Cop[idxRP];

end;

 

initialization

 

{Предположим файл находится на C:\ диске}

fFile := TIniFile.Create('c:\lang.cnf');

try

{Заполнение массива рублей}

fString := fFile.ReadString('Money', 'Rub', ',');

LexemsToDim(fString, Rubl);

 

{Заполнение массива копеек}

fString := fFile.ReadString('Money', 'Cop', ',');

LexemsToDim(fString, Cop);

 

{Заполнение массива чисел}

fString := fFile.ReadString('Nums', 'Numbers', ',');

LexemsToDim(fString, fdim);

NameNum[0, 1] := '';

for i := 1to9do

NameNum[i, 1] := fdim[i - 1];

 

{Заполнение массива десятков}

fString := fFile.ReadString('Nums', 'Tens', ',');

LexemsToDim(fString, fdim);

NameNum[0, 2] := '';

for i := 1to9do

NameNum[i, 2] := fdim[i - 1];

 

{Заполнение массива сотен}

fString := fFile.ReadString('Nums', 'Hundreds', ',');

LexemsToDim(fString, fdim);

NameNum[0, 3] := '';

for i := 1to9do

NameNum[i, 3] := fdim[i - 1];

 

{Заполнение массива чисел после десяти}

fString := fFile.ReadString('Nums', 'AfterTen', ',');

LexemsToDim(fString, fdim);

NameNum[0, 4] := '';

for i := 1to9do

NameNum[i, 4] := fdim[i - 1];

 

{Заполнение расширений чисел}

Ext[0, 1] := '';

Ext[0, 2] := '';

Ext[0, 3] := '';

 

{Тысячи}

fString := fFile.ReadString('Nums', 'Thou', ',');

LexemsToDim(fString, fdim);

for i := 1to3do

Ext[1, i] := fdim[i - 1];

 

{Миллионы}

fString := fFile.ReadString('Nums', 'Mill', ',');

LexemsToDim(fString, fdim);

for i := 1to3do

Ext[2, i] := fdim[i - 1];

 

{Миллиарды}

fString := fFile.ReadString('Nums', 'Bill', ',');

LexemsToDim(fString, fdim);

for i := 1to3do

Ext[3, i] := fdim[i - 1];

 

{Триллион}

fString := fFile.ReadString('Nums', 'Thrill', ',');

LexemsToDim(fString, fdim);

for i := 1to3do

Ext[4, i] := fdim[i - 1];

 

Zero := fFile.ReadString('Nums', 'Zero', '0');

if Zero[Length(Zero)] = ','then

Zero := Copy(Zero, 1, Length(Zero) - 1) + ' ';

 

One := fFile.ReadString('Nums', 'One', '1');

if One[Length(One)] = ','then

One := Copy(One, 1, Length(One) - 1) + ' ';

 

Two := fFile.ReadString('Nums', 'Two', '0');

if Two[Length(Two)] = ','then

Two := Copy(Two, 1, Length(Two) - 1) + ' ';

 

{Заполнение таблицы окончаний}

Univer[1, 1] := 1;

Univer[1, 2] := 2;

Univer[1, 3] := 2;

Univer[1, 4] := 2;

Univer[2, 1] := 3;

Univer[2, 2] := 2;

Univer[2, 3] := 2;

Univer[2, 4] := 2;

Univer[3, 1] := 3;

Univer[3, 2] := 2;

Univer[3, 3] := 2;

Univer[3, 4] := 2;

Univer[4, 1] := 3;

Univer[4, 2] := 2;

Univer[4, 3] := 2;

Univer[4, 4] := 2;

Univer[5, 1] := 2;

Univer[5, 2] := 2;

Univer[5, 3] := 2;

Univer[5, 4] := 2;

Univer[6, 1] := 2;

Univer[6, 2] := 2;

Univer[6, 3] := 2;

Univer[6, 4] := 2;

Univer[7, 1] := 2;

Univer[7, 2] := 2;

Univer[7, 3] := 2;

Univer[7, 4] := 2;

Univer[8, 1] := 2;

Univer[8, 2] := 2;

Univer[8, 3] := 2;

Univer[8, 4] := 2;

Univer[9, 1] := 2;

Univer[9, 2] := 2;

Univer[9, 3] := 2;

Univer[9, 4] := 2;

finally

fFile.Free;

end;

 

end.

 

 

 

 

Code:Lang.cnf

[Nums]

Numbers=один,два,три,четыре,пять,шесть,семь,восемь,девять,

One=одна,

Two=две,

Tens=десять,двадцать,тридцать,сорок,пятьдесят,шестьдесят,семьдесят,восемьдесят,девяносто,

Hundreds=сто,двести,триста,четыреста,пятьсот,шестьсот,семьсот,восемьсот,девятьсот,

AfterTen=одиннадцать,двенадцать,тринадцать,четырнадцать,пятнадцать,шестнадцать,семнадцать,восемнадцать,девятнадцать,

Zero=ноль,

Thou=тысяча,тысяч,тысячи,

Mill=миллион,миллионов,миллиона,

Bill=миллиард,миллиардов,миллиарда,

Thrill=триллион,триллионов,триллиона,

 

[Money]

Rub=рубль,рублей,рубля,

Cop=копейка,копеек,копейки,

 

 

https://delphiworld.narod

DelphiWorld 6.0

 


 

Code:

unit sumstr;

 

interface

 

uses

SysUtils, StrUtils;

 

function SumToString(Value: string): string;

 

implementation

const

 

a: array[0..8,0..9] ofstring=(

('','один ','два ','три ','четыре ','пять ','шесть ','семь ','восемь ','девять '),

('','','двадцать ','тридцать ','сорок ','пятьдесят ','шестьдесят ','семьдесят ','восемьдесят ','девяносто '),

('','сто ','двести ','триста ','четыреста ','пятьсот ','шестьсот ','семьсот ','восемьсот ','девятьсот '),

('тысяч ','тысяча ','две тысячи ','три тысячи ','четыре тысячи ','пять тысячь ','шесть тысячь ','семь тысячь ',

'восемь тысячь ','девять тысячь '),

('','','двадцать ','тридцать ','сорок ','пятьдесят ','шестьдесят ','семьдесят ','восемьдесят ','девяносто '),

('','сто ','двести ','триста ','четыреста ','пятьсот ','шестьсот ','семьсот ','восемьсот ','девятьсот '),

('миллионов ','один миллион ','два миллиона ','три миллиона ','четыре миллиона ','пять миллионов ',

'шесть миллионов ','семь миллионов ','восемь миллионов ','девять миллионов '),

('','','двадцать ','тридцать ','сорок ','пятьдесят ','шестьдесят ','семьдесят ','восемьдесят ','девяносто '),

('','сто ','двести ','триста ','четыреста ','пятьсот ','шестьсот ','семьсот ','восемьсот ','девятьсот '));

 

b: array[0..9] ofstring=

('десять ','одинадцать ','двенадцать ','тринадцать ','четырнадцать ','пятьнадцать ','шестьнадцать ',

'семьнадцать ','восемьнадцать ','девятьнадцать ');

 

function SumToStrin(Value: string): string;

var

s, t: string;

p, pp, i, k: integer;

begin

s:=value;

if s='0'then

t:='Ноль '

else

begin

p:=length(s);

pp:=p;

if p>1then

if (s[p-1]='1') and (s[p]>'0') then

begin

t:=b[strtoint(s[p])];

pp:=pp-2;

end;

i:=pp;

while i>0do

begin

if (i=p-3) and (p>4) then

if s[p-4]='1'then

begin

t:=b[strtoint(s[p-3])]+'тысяч '+t;

i:=i-2;

end;

if (i=p-6) and (p>7) then

if s[p-7]='1'then

begin

t:=b[strtoint(s[p-6])]+'миллионов '+t;

i:=i-2;

end;

if i>0then

begin

k:=strtoint(s[i]);

t:=a[p-i,k]+t;

i:=i-1;

end;

end;

end;

result:=t;

end;

 

procedure get2str(value: string; var hi, lo: string);

var

p: integer;

begin

p:=pos(',', value);

lo:='';

hi:='';

if p=0then

p:=pos('.', value);

if p<>0then

delete(value,p,1);

if p=0then

begin

hi:=value;

lo:='00';

end;

if p>length(value) then

begin

hi:=value;

lo:='00';

end;

if p=1then

begin

hi:='0';

lo:=value;

end;

if (p>1) and (p then

begin

hi:=copy(value,1,p-1);

lo:=copy(value,p,length(value));

end;

end;

 

function sumtostring(value: string): string;

var

hi, lo: string;

pr, er: integer;

begin

get2str(value,hi,lo);

if (hi='') or (lo='') then

begin

result:='';

exit;

end;

val(hi,pr,er);

if er<>0then

begin

result:='';

exit;

end;

hi:=sumtostrin(inttostr(pr))+'руб. ';

if lo<>'00'then

begin

val(lo,pr,er);

if er<>0then

begin

result:='';

exit;

end;

lo:=inttostr(pr);

end;

lo:=lo+' коп. ';

hi[1]:=AnsiUpperCase(hi[1])[1];

result:=hi+lo;

end;

 

end.

 

https://delphiworld.narod

DelphiWorld 6.0


 

Этот алгоритм преобразует 12345 в "двенадцать тысяч триста сорок пять". Для этого создана процедура, которая преобразует трехзначные числа в слова и прибавляет к ним "тысяч" или "миллионов". Алгоритм корректен в смысле падежей и родов. Поэтому 121000 он не переведет в "сто двадцать один тысяч".

 

 

Code:

function ShortNum(num: word; razr: integer): string;

const

hundreds: array [0..9] ofstring =

('', ' сто', ' двести', ' триста',

' четыреста', ' пятьсот', ' шестьсот', ' семьсот', ' восемьсот',

' девятьсот');

 

tens: array [0..9] ofstring =

('', '', ' двадцать', ' тридцать',

' сорок', ' пятьдесят', ' шестьдесят', ' семьдесят', ' восемьдесят',

' девяносто');

 

ones: array [3..19] ofstring =

(' три', ' четыре', ' пять', ' шесть',

' семь', ' восемь', ' девять', ' десять', ' одиннадцать',

' двенадцать', ' тринадцать', ' четырнадцать', ' пятнадцать',

' шестнадцать', ' семнадцать', ' восемнадцать', ' девятнадцать');

 

razryad: array [0..6] ofstring =

('', ' тысяч', ' миллион', ' миллиард',

' триллион', ' квадриллион', ' квинтиллион');

 

var

t: byte; // десятки

o: byte; // единицы

begin

result := hundreds[num div100];

if num = 0then

Exit;

t := (num mod100) div10;

o := num mod10;

if t <> 1then

begin

result := result + tens[t];

case o of

1:

if razr = 1then

result := result + ' одна'

else

result := result + ' один';

2:

if razr = 1then

result := result + ' две'

else

result := result + ' два';

3..9:

result := result + ones[o];

end;

result := result + razryad[razr];

case o of

1:

if razr = 1then

result := result + 'а';

2..4:

if razr = 1then

result := result + 'и'

else

if razr > 1then

result := result + 'а';

else

if razr > 1then

result := result + 'ов';

end;

end

else

begin

result := result + ones[num mod100];

result := result + razryad[razr];

if razr > 1then

result := result + 'ов';

end;

end;

 

function IntToWords(s: string): string;

var

i, count: integer;

begin

if (Length(s) <= 0) or (s = '0') then

begin

result := 'ноль';

Exit;

end;

count := (Length(s) + 2) div3;

if count > 7then

begin

result := 'Value is too large';

Exit;

end;

result := '';

s := '00' + s;

for i := 1to count do

result := ShortNum(StrToInt(copy(s, Length(s) - 3 * i + 1, 3)),

i - 1) + result;

if Length(result) > 0then

delete(result, 1, 1);

end;

 

procedure TForm1.Button1Click(Sender: TObject);

begin

Edit2.Text := IntToWords(Edit1.Text);

end;

 

https://delphiworld.narod.

DelphiWorld 6.0

 


 

 

 

Code:

{ **** UBPFD *********** by delphibase.endimus****

>> Сумма и количество прописью, работа с падежами

 

Несколько функций для работы с строками:

function SumToString(Value : String) : string;//Сумма прописью

function KolToStrin(Value : String) : string;//Количество прописью

function padeg(s:string):string;//Склоняет фамилию имя и отчество (кому)

function padegot(s:string):string;//Склоняет фамилию имя и отчество (от кого)

function fio(s:string):string;//фамилия имя и отчество сокращенно

function longdate(s:string):string;//Длинная дата

procedure getfullfio(s:string;var fnam,lnam,onam:string);

//Получить из строки фамилию имя и отчество сокращенно

 

Зависимости: uses SysUtils, StrUtils,Classes;

Автор: Eda, eda arhadm.net.ru, Архангельск

Copyright: Eda

Дата: 13 июня 20013 г.

***************************************************** }

 

unit sumstr;

 

interface

uses

SysUtils, StrUtils, Classes;

var

rub: byte;

function SumToString(Value: string): string; //Сумма прописью

function KolToStrin(Value: string): string; //Количество прописью

function padeg(s: string): string; //Склоняет фамилию имя и отчество (кому)

function padegot(s: string): string; //Склоняет фамилию имя и отчество (от кого)

function fio(s: string): string; //фамилия имя и отчество сокращенно

function longdate(s: string): string; //Длинная дата

procedure getfullfio(s: string; var fnam, lnam, onam: string);

//Получить из строки фамилию имя и отчество сокращенно

 

implementation

const

a: array[0..8, 0..9] ofstring = (

('', 'один ', 'два ', 'три ', 'четыре ', 'пять ', 'шесть ', 'семь ',

'восемь ', 'девять '),

('', '', 'двадцать ', 'тридцать ', 'сорок ', 'пятьдесят ', 'шестьдесят ',

'семьдесят ', 'восемьдесят ', 'девяносто '),

('', 'сто ', 'двести ', 'триста ', 'четыреста ', 'пятьсот ', 'шестьсот ',

'семьсот ', 'восемьсот ', 'девятьсот '),

('тысяч ', 'одна тысяча ', 'две тысячи ', 'три тысячи ', 'четыре тысячи ',

'пять тысяч ', 'шесть тысяч ', 'семь тысяч ', 'восемь тысяч ',

'девять тысяч '),

('', '', 'двадцать ', 'тридцать ', 'сорок ', 'пятьдесят ', 'шестьдесят ',

'семьдесят ', 'восемьдесят ', 'девяносто '),

('', 'сто ', 'двести ', 'триста ', 'четыреста ', 'пятьсот ', 'шестьсот ',

'семьсот ', 'восемьсот ', 'девятьсот '),

('миллионов ', 'один миллион ', 'два миллиона ', 'три миллиона ',

'четыре миллиона ', 'пять миллионов ', 'шесть миллионов ', 'семь миллионов ',

'восемь миллионов ', 'девять миллионов '),

('', '', 'двадцать ', 'тридцать ', 'сорок ', 'пятьдесят ', 'шестьдесят ',

'семьдесят ', 'восемьдесят ', 'девяносто '),

('', 'сто ', 'двести ', 'триста ', 'четыреста ', 'пятьсот ', 'шестьсот ',

'семьсот ', 'восемьсот ', 'девятьсот '));

c: array[0..8, 0..9] ofstring = (

('', 'одна ', 'две ', 'три ', 'четыре ', 'пять ', 'шесть ', 'семь ',

'восемь ', 'девять '),

('', '', 'двадцать ', 'тридцать ', 'сорок ', 'пятьдесят ', 'шестьдесят ',

'семьдесят ', 'восемьдесят ', 'девяносто '),

('', 'сто ', 'двести ', 'триста ', 'четыреста ', 'пятьсот ', 'шестьсот ',

'семьсот ', 'восемьсот ', 'девятьсот '),

('тысячь ', 'одна тысяча ', 'две тысячи ', 'три тысячи ', 'четыре тысячи ',

'пять тысяч ', 'шесть тысяч ', 'семь тысяч ', 'восемь тысяч ',

'девять тысяч '),

('', '', 'двадцать ', 'тридцать ', 'сорок ', 'пятьдесят ', 'шестьдесят ',

'семьдесят ', 'восемьдесят ', 'девяносто '),

('', 'сто ', 'двести ', 'триста ', 'четыреста ', 'пятьсот ', 'шестьсот ',

'семьсот ', 'восемьсот ', 'девятьсот '),

('миллионов ', 'один миллион ', 'два миллиона ', 'три миллиона ',

'четыре миллиона ', 'пять миллионов ', 'шесть миллионов ', 'семь миллионов ',

'восемь миллионов ', 'девять миллионов '),

('', '', 'двадцать ', 'тридцать ', 'сорок ', 'пятьдесят ', 'шестьдесят ',

'семьдесят ', 'восемьдесят ', 'девяносто '),

('', 'сто ', 'двести ', 'триста ', 'четыреста ', 'пятьсот ', 'шестьсот ',

'семьсот ', 'восемьсот ', 'девятьсот '));

b: array[0..9] ofstring =

('десять ', 'одинадцать ', 'двенадцать ', 'тринадцать ', 'четырнадцать ',

'пятнадцать ', 'шестнадцать ', 'семнадцать ', 'восемнадцать ',

'девятнадцать ');

var

pol: boolean;

 

function longdate(s: string): string; //Длинная дата

var

Pr: TDateTime;

Y, M, D: Word;

begin

Pr := strtodate(s);

DecodeDate(Pr, Y, M, D);

case m of

1: s := 'Января';

2: s := 'Февраля';

3: s := 'Марта';

4: s := 'Апреля';

5: s := 'Мая';

6: s := 'Июня';

7: s := 'Июля';

8: s := 'Августа';

9: s := 'Сентября';

10: s := 'Октября';

11: s := 'Ноября';

12: s := 'Декабря';

end;

result := inttostr(d) + ' ' + s + ' ' + inttostr(y)

end;

 

function SumToStrin(Value: string): string;

var

s, t: string;

p, pp, i, k: integer;

begin

s := value;

if s = '0'then

t := 'Ноль '

else

begin

p := length(s);

pp := p;

if p > 1then

if (s[p - 1] = '1') and (s[p] >= '0') then

begin

t := b[strtoint(s[p])];

pp := pp - 2;

end;

i := pp;

while i > 0do

begin

if (i = p - 3) and (p > 4) then

if s[p - 4] = '1'then

begin

t := b[strtoint(s[p - 3])] + 'тысяч ' + t;

i := i - 2;

end;

if (i = p - 6) and (p > 7) then

if s[p - 7] = '1'then

begin

t := b[strtoint(s[p - 6])] + 'миллионов ' + t;

i := i - 2;

end;

if i > 0then

begin

k := strtoint(s[i]);

t := a[p - i, k] + t;

i := i - 1;

end;

end;

end;

result := t;

end;

 

function kolToStrin(Value: string): string;

var

s, t: string;

p, pp, i, k: integer;

begin

s := value;

if s = '0'then

t := 'Ноль '

else

begin

p := length(s);

pp := p;

if p > 1then

if (s[p - 1] = '1') and (s[p] > '0') then

begin

t := b[strtoint(s[p])];

pp := pp - 2;

end;

i := pp;

while i > 0do

begin

if (i = p - 3) and (p > 4) then

if s[p - 4] = '1'then

begin

t := b[strtoint(s[p - 3])] + 'тысяча ' + t;

i := i - 2;

end;

if (i = p - 6) and (p > 7) then

if s[p - 7] = '1'then

begin

t := b[strtoint(s[p - 6])] + 'миллионов ' + t;

i := i - 2;

end;

if i > 0then

begin

k := strtoint(s[i]);

t := c[p - i, k] + t;

i := i - 1;

end;

end;

end;

result := t;

end;

 

procedure get2str(value: string; var hi, lo: string);

var

p: integer;

begin

p := pos(',', value);

lo := '';

hi := '';

if p = 0then

p := pos('.', value);

if p <> 0then

delete(value, p, 1);

if p = 0then

begin

hi := value;

lo := '00';

exit;

end;

if p > length(value) then

begin

hi := value;

lo := '00';

exit;

end;

if p = 1then

begin

hi := '0';

lo := value;

exit;

end;

begin

hi := copy(value, 1, p - 1);

lo := copy(value, p, length(value));

if length(lo) < 2then

lo := lo + '0';

end;

end;

 

function sumtostring(value: string): string;

var

hi, lo, valut, loval: string;

pr, er: integer;

begin

get2str(value, hi, lo);

if (hi = '') or (lo = '') then

begin

result := '';

exit;

end;

val(hi, pr, er);

if er <> 0then

begin

result := '';

exit;

end;

if rub = 0then

begin

if hi[length(hi)] = '1'then

valut := 'рубль ';

if (hi[length(hi)] >= '2') and (hi[length(hi)] <= '4') then

valut := 'рубля ';

if (hi[length(hi)] = '0') or (hi[length(hi)] >= '5') or

((strtoint(copy(hi, length(hi) - 1, 2)) > 10) and (strtoint(copy(hi,

length(hi) - 1, 2)) < 15)) then

valut := 'рублей ';

if (lo[length(lo)] = '0') or (lo[length(lo)] >= '5') then

loval := ' копеек';

if lo[length(lo)] = '1'then

loval := ' копейка';

if (lo[length(lo)] >= '2') and (lo[length(lo)] <= '4') then

loval := ' копейки';

end

else

begin

if (hi[length(hi)] = '0') or (hi[length(hi)] >= '5') then

valut := 'долларов ';

if hi[length(hi)] = '1'then

valut := 'доллар ';

if (hi[length(hi)] >= '2') and (hi[length(hi)] <= '4') then

valut := 'доллара ';

if (lo[length(lo)] = '0') or (lo[length(lo)] >= '5') then

loval := ' центов';

if lo[length(lo)] = '1'then

loval := ' цент';

if (lo[length(lo)] >= '2') and (lo[length(lo)] <= '4') then

loval := ' цента';

end;

hi := sumtostrin(inttostr(pr)) + valut;

if lo <> '00'then

begin

val(lo, pr, er);

if er <> 0then

begin

result := '';

exit;

end;

lo := inttostr(pr);

end;

if length(lo) < 2then

lo := '0' + lo;

lo := lo + loval;

hi[1] := AnsiUpperCase(hi[1])[1];

result := hi + lo;

end;

 

function pfam(s: string): string;

begin

if (s[length(s)] = 'к') or (s[length(s)] = 'ч') and (pol = true) then

s := s + 'у';

if s[length(s)] = 'в'then

s := s + 'у';

if s[length(s)] = 'а'then

begin

delete(s, length(s), 1);

result := s + 'ой';

exit;

end;

if s[length(s)] = 'н'then

s := s + 'у';

if s[length(s)] = 'й'then

begin

delete(s, length(s) - 1, 2);

result := s + 'ому';

end;

if s[length(s)] = 'я'then

begin

delete(s, length(s) - 1, 2);

result := s + 'ой';

exit;

end;

result := s;

end;

 

function pnam(s: string): string;

begin

pol := true;

if s[length(s)] = 'й'then

begin

delete(s, length(s), 1);

s := s + 'ю';

end;

if s[length(s)] = 'л'then

s := s + 'у';

if s[length(s)] = 'р'then

s := s + 'у';

if s[length(s)] = 'м'then

s := s + 'у';

if s[length(s)] = 'н'then

s := s + 'у';

if s[length(s)] = 'я'then

begin

pol := false;

delete(s, length(s), 1);

s := s + 'е';

end;

if s[length(s)] = 'а'then

begin

pol := false;

delete(s, length(s), 1);

s := s + 'е';

end;

result := s;

end;

 

function potch(s: string): string;

begin

if s[length(s)] = 'а'then

begin

delete(s, length(s), 1);

s := s + 'е';

end;

if s[length(s)] = 'ч'then

s := s + 'у';

result := s;

end;

 

function ofam(s: string): string;

begin

if (s[length(s)] = 'к') or (s[length(s)] = 'ч') and (pol = true) then

s := s + 'а';

if s[length(s)] = 'а'then

begin

delete(s, length(s), 1);

result := s + 'ой';

exit;

end;

if s[length(s)] = 'в'then

s := s + 'а';

if s[length(s)] = 'н'then

s := s + 'а';

if s[length(s)] = 'й'then

begin

delete(s, length(s) - 1, 2);

result := s + 'ова';

end;

if s[length(s)] = 'я'then

begin

delete(s, length(s) - 1, 2);

result := s + 'ой';

exit;

end;

result := s;

end;

 

function onam(s: string): string;

begin

pol := true;

if s[length(s)] = 'а'then

if s[length(s) - 1] = 'г'then

begin

pol := false;

delete(s, length(s), 1);

s := s + 'и';

end

else

begin

pol := false;

delete(s, length(s), 1);

s := s + 'ы';

end;

if s[length(s)] = 'л'then

s := s + 'а';

if s[length(s)] = 'р'then

s := s + 'а';

if s[length(s)] = 'м'then

s := s + 'а';

if s[length(s)] = 'н'then

s := s + 'а';

if s[length(s)] = 'я'then

begin

pol := false;

delete(s, length(s), 1);

s := s + 'и';

end;

if s[length(s)] = 'й'then

begin

delete(s, length(s), 1);

s := s + 'я';

end;

result := s;

end;

 

function ootch(s: string): string;

begin

if s[length(s)] = 'а'then

begin

delete(s, length(s), 1);

s := s + 'ы';

end;

if s[length(s)] = 'ч'then

s := s + 'а';

result := s;

end;

 

function padeg(s: string): string;

var

q: tstringlist;

p: integer;

begin

if s <> ''then

begin

q := tstringlist.Create;

p := pos(' ', s);

if p = 0then

p := pos('.', s);

if p = 0then

q.Add(s)

else

begin

q.Add(copy(s, 1, p - 1));

delete(s, 1, p);

p := pos(' ', s);

if p = 0then

p := pos('.', s);

if p = 0then

q.Add(s)

else

begin

q.Add(copy(s, 1, p - 1));

delete(s, 1, p);

p := pos(' ', s);

if p = 0then

p := pos('.', s);

if p = 0then

q.Add(s)

else

begin

q.Add(copy(s, 1, p - 1));

delete(s, 1, p);

end;

end;

end;

if q.Count > 1then

result := result + ' ' + pnam(q[1]);

if q.Count > 0then

result := pfam(q[0]) + result;

if q.Count > 2then

result := result + ' ' + potch(q[2]);

q.Free;

end;

end;

 

function fio(s: string): string;

var

q: tstringlist;

p: integer;

begin

if s <> ''then

begin

q := tstringlist.Create;

p := pos(' ', s);

if p = 0then

p := pos('.', s);

if p = 0then

q.Add(s)

else

begin

q.Add(copy(s, 1, p - 1));

delete(s, 1, p);

p := pos(' ', s);

if p = 0then

p := pos('.', s);

if p = 0then

q.Add(s)

else

begin

q.Add(copy(s, 1, 1));

delete(s, 1, p);

p := pos(' ', s);

if p = 0then

p := pos('.', s);

if p = 0then

q.Add(copy(s, 1, 1))

else

begin

q.Add(copy(s, 1, 1));

end;

end;

end;

if q.Count > 1then

result := q[0] + ' ' + q[1] + '.';

if q.Count > 2then

result := result + q[2] + '.';

q.Free;

end;

end;

 

function padegot(s: string): string;

var

q: tstringlist;

p: integer;

begin

if s <> ''then

begin

q := tstringlist.Create;

p := pos(' ', s);

if p = 0then

p := pos('.', s);

if p = 0then

q.Add(s)

else

begin

q.Add(copy(s, 1, p - 1));

delete(s, 1, p);

p := pos(' ', s);

if p = 0then

p := pos('.', s);

if p = 0then

q.Add(s)

else

begin

q.Add(copy(s, 1, p - 1));

delete(s, 1, p);

p := pos(' ', s);

if p = 0then

p := pos('.', s);

if p = 0then

q.Add(s)

else

begin

q.Add(copy(s, 1, p - 1));

delete(s, 1, p);

end;

end;

end;

if q.Count > 1then

result := result + ' ' + onam(q[1]);

if q.Count > 0then

result := ofam(q[0]) + result;

if q.Count > 2then

result := result + ' ' + ootch(q[2]);

q.Free;

end;

end;

 

procedure getfullfio(s: string; var fnam, lnam, onam: string);

//Получить из строки фамилию имя и отчество сокращенно

begin

fnam := '';

lnam := '';

onam := '';

fnam := copy(s, 1, pos(' ', s));

delete(s, 1, pos(' ', s));

lnam := copy(s, 1, pos(' ', s));

delete(s, 1, pos(' ', s));

onam := s;

end;

 

begin

rub := 0;

end.

Пример использования:

 

s := SumToString('123.00');

 

 

 

 


 

Code:

{ **** UBPFD *********** by delphibase.endimus ****

>> Конвертация денежных сумм в строковое выражение

 

Конвертация денежных сумм в строковое выражение впоть до додециллиона,

причем легко наращивается. Небольшая по размеру.

 

Зависимости: System

Автор: Раков Андрей, klopmail mail.ru, Курчатов

Copyright: Раков А.В.

Дата: 17 августа 20012 г.

***************************************************** }

 

function MoneyToStr(DD: string): string;

{(С) Раков А.В. 05.2002 e-mail: klopmail mail.ru сайт: }

type

TTroyka = array[1..3] of Byte;

TMyString = array[1..19] ofstring[12];

var

S, OutS, S2: string;

k, L, kk: Integer;

Troyka: TTroyka;

V1: TMyString;

Mb: Byte;

const

V11: TMyString =

('один', 'два', 'три', 'четыре', 'пять', 'шесть', 'семь', 'восемь', 'девять',

'десять', 'одиннадцать',

'двенадцать', 'тринадцать', 'четырнадцать', 'пятнадцать', 'шестнадцать',

'семнадцать', 'восемнадцать', 'девятнадцать');

V2: array[1..8] ofstring =

('двадцать', 'тридцать', 'сорок', 'пятьдесят', 'шестьдесят', 'семьдесят',

'восемьдесят', 'девяносто');

V3: array[1..9] ofstring =

('сто', 'двести', 'триста', 'четыреста', 'пятьсот', 'шестьсот', 'семьсот',

'восемьсот', 'девятьсот');

M1: array[1..13, 1..3] ofstring = (('тысяча', 'тысячи', 'тысяч'),

('миллион', 'миллиона', 'миллионов'),

('миллиард', 'миллиарда', 'миллиардов'),

('триллион', 'триллиона', 'триллионов'),

('квадриллион', 'квадриллиона', 'квадриллионов'),

('квинтиллион', 'квинтиллиона', 'квинтиллионов'),

('секстиллион', 'секстиллиона', 'секстиллионов'),

('сентиллион', 'сентиллиона', 'сентиллионов'),

('октиллион', 'октиллиона', 'октиллионов'),

('нониллион', 'нониллиона', 'нониллионов'),

('дециллион', 'дециллиона', 'дециллионов'),

('ундециллион', 'ундециллиона', 'ундециллионов'),

('додециллион', 'додециллиона', 'додециллионов'));

R1: array[1..3] ofstring = ('рубль', 'рубля', 'рублей');

R2: array[1..3] ofstring = ('копейка', 'копейки', 'копеек');

function TroykaToStr(L: ShortInt; TR: TTroyka): string;

var

S: string;

begin

S := '';

if Abs(L) = 1then

begin

V1[1] := 'одна';

V1[2] := 'две';

end

else

begin

V1[1] := 'один';

V1[2] := 'два';

end;

if Troyka[2] = 1then

begin

Troyka[2] := 0;

Troyka[3] := 10 + Troyka[3];

end;

if Troyka[3] <> 0then

S := V1[Troyka[3]];

if Troyka[2] <> 0then

S := V2[Troyka[2] - 1] + ' ' + S;

if Troyka[1] <> 0then

S := V3[Troyka[1]] + ' ' + S;

if (L > 0) and (S <> '') then

case Troyka[3] of

1: S := S + ' ' + M1[L, 1] + ' ';

2..4: S := S + ' ' + M1[L, 2] + ' ';

else

S := S + ' ' + M1[L, 3] + ' ';

end;

TroykaToStr := S;

end;

begin

V1 := V11;

L := 0;

OutS := '';

kk := Pos(',', DD);

if kk = 0then

S := DD

else

S := Copy(DD, 1, kk - 1);

if S = '0'then

S2 := ''

else

S2 := S;

repeat

for k := 3downto1do

if Length(S) > 0then

begin

Troyka[k] := StrToInt(S[Length(S)]);

Delete(S, Length(S), 1);

end

else

Troyka[k] := 0;

OutS := TroykaToStr(L, Troyka) + OutS;

if L = 0then

Mb := Troyka[3];

Inc(L);

until Length(S) = 0;

case Mb of

0: if Length(S2) > 0then

OutS := OutS + ' ' + R1[3] + ' ';

1: OutS := OutS + ' ' + R1[1] + ' ';

2..4: OutS := OutS + ' ' + R1[2] + ' ';

else

OutS := OutS + ' ' + R1[3] + ' ';

end;

S2 := '';

if kk <> 0then

begin

DD := Copy(DD, kk + 1, 2);

if Length(DD) = 1then

DD := DD + '0';

k := StrToInt(DD);

Troyka[1] := 0;

Troyka[2] := k div10;

Troyka[3] := k mod10;

S2 := TroykaToStr(-1, Troyka);

case Troyka[3] of

0: if Troyka[2] = 0then

S := ''

else

S := R2[3];

1: S := R2[1];

2..4: S := R2[2];

else

S := R2[3];

end;

end;

// MoneyToStr:=OutS+IntToStr(k)+' '+S; // если копейки нужны цифрой-эту строку раскоментировать

MoneyToStr := OutS + S2 + ' ' + S; // а эту закоментировать

end;

Пример использования:

 

S := MoneyToStr('76576876876976576437654365,98');

 

 

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

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

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

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


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