LMS-2_ReportAPI/numberinwords.pas
Алексей Заблоцкий d6ad951e55 Первая версия
2023-10-18 22:41:44 +03:00

465 lines
15 KiB
ObjectPascal
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

unit numberinwords;
interface
function number999(number: integer; gender: integer; declension: integer): string;
function number999_ord(number: integer; gender: integer; declension: integer): string;
implementation
function number900(centi: integer; declension: integer): string;
begin
case centi of
0:;
1: case declension of
0: Result := 'сто';
1: Result := 'ста';
2: Result := 'ста';
3: Result := 'сто';
4: Result := 'ста';
5: Result := 'ста';
end;
2: case declension of
0: Result := 'двести';
1: Result := 'двухсот';
2: Result := 'двумстам';
3: Result := 'двести';
4: Result := 'двумястами';
5: Result := 'двухстах';
end;
3: case declension of
0: Result := 'триста';
1: Result := 'трехсот';
2: Result := 'тремстам';
3: Result := 'триста';
4: Result := 'тремястами';
5: Result := 'трехстах';
end;
4: case declension of
0: Result := 'четыреста';
1: Result := 'четырехсот';
2: Result := 'четыремстам';
3: Result := 'четыреста';
4: Result := 'четырьмястами';
5: Result := 'четырехстах';
end;
5: case declension of
0: Result := 'пятьсот';
1: Result := 'пятисот';
2: Result := 'пятистам';
3: Result := 'пятьсот';
4: Result := 'пятьюстами';
5: Result := 'пятистах';
end;
6: case declension of
0: Result := 'шестьсот';
1: Result := 'шестисот';
2: Result := 'шестистам';
3: Result := 'шестьсот';
4: Result := 'шестьюстами';
5: Result := 'шестистах';
end;
7: case declension of
0: Result := 'семьсот';
1: Result := 'семисот';
2: Result := 'семистам';
3: Result := 'семьсот';
4: Result := 'семьюстами';
5: Result := 'семистах';
end;
8: case declension of
0: Result := 'восемьсот';
1: Result := 'восьмисот';
2: Result := 'восьмистам';
3: Result := 'восемьсот';
4: Result := 'восемьюстами';
5: Result := 'восьмистах';
end;
9: case declension of
0: Result := 'девятьсот';
1: Result := 'девятисот';
2: Result := 'девятистам';
3: Result := 'девятьсот';
4: Result := 'девятьюстами';
5: Result := 'девятистах';
end;
end;
end;
function Adjective1(gender,declension: integer): string;
begin
case declension of
0: case gender of
0: result := 'ый';
1: result := 'ая';
2: result := 'ое';
end;
1: case gender of
0: result := 'ого';
1: result := 'ой';
2: result := 'ого';
end;
2: case gender of
0: result := 'ому';
1: result := 'ой';
2: result := 'ому';
end;
3: case gender of
0: result := 'ый';
1: result := 'ую';
2: result := 'ое';
end;
4: case gender of
0: result := 'ым';
1: result := 'ой';
2: result := 'ым';
end;
5: case gender of
0: result := 'ом';
1: result := 'ой';
2: result := 'ом';
end;
end;
end;
function Adjective2(gender,declension: integer): string;
begin
if (gender=0) and (declension in [0,3]) then result := 'ой'
else result := Adjective1(gender,declension);
end;
function Adjective3(gender,declension: integer): string;
begin
case declension of
0: case gender of
0: result := 'ий';
1: result := 'яя';
2: result := 'ье';
end;
1: case gender of
0: result := 'ьего';
1: result := 'ей';
2: result := 'ьего';
end;
2: case gender of
0: result := 'ьему';
1: result := 'ей';
2: result := 'ьему';
end;
3: case gender of
0: result := 'ий';
1: result := 'ью';
2: result := 'ье';
end;
4: case gender of
0: result := 'ьим';
1: result := 'ьей';
2: result := 'ьим';
end;
5: case gender of
0: result := 'ьем';
1: result := 'ьей';
2: result := 'ьем';
end;
end;
end;
function number900_ord(centi: integer; gender: integer; declension: integer): string;
begin
case centi of
0:;
1: result := 'сот'+Adjective1( gender, declension);
2: result := 'двухсот'+Adjective1( gender, declension);
3: result := 'трехсот'+Adjective1( gender, declension);
4: result := 'четырехсот'+Adjective1( gender, declension);
5: result := 'пятисот'+Adjective1( gender, declension);
6: result := 'шестисот'+Adjective1( gender, declension);
7: result := 'семисот'+Adjective1( gender, declension);
8: result := 'восьмисот'+Adjective1( gender, declension);
9: result := 'девятисот'+Adjective1( gender, declension);
end;
end;
function number90(decades: integer; declension: integer): string;
begin
case decades of
0,1:;
2: case declension of
0: Result := 'двадцать';
1: Result := 'двадцати';
2: Result := 'двадцати';
3: Result := 'двадцать';
4: Result := 'двадцатью';
5: Result := 'двадцати';
end;
3: case declension of
0: Result := 'тридцать';
1: Result := 'тридцати';
2: Result := 'тридцати';
3: Result := 'тридцать';
4: Result := 'тридцатью';
5: Result := 'тридцати';
end;
4: case declension of
0: Result := 'сорок';
1: Result := 'сорока';
2: Result := 'сорока';
3: Result := 'сорок';
4: Result := 'сорока';
5: Result := 'сорока';
end;
5: case declension of
0: Result := 'пятьдесят';
1: Result := 'пятидесяти';
2: Result := 'пятидесяти';
3: Result := 'пятьдесят';
4: Result := 'пятьюдесятью';
5: Result := 'пятидесяти';
end;
6: case declension of
0: Result := 'шестьдесят';
1: Result := 'шестидесяти';
2: Result := 'шестидесяти';
3: Result := 'шестьдесят';
4: Result := 'шестьюдесятью';
5: Result := 'шестидесяти';
end;
7: case declension of
0: Result := 'семьдесят';
1: Result := 'семидесяти';
2: Result := 'семидесяти';
3: Result := 'семьдесят';
4: Result := 'семьюдесятью';
5: Result := 'семидесяти';
end;
8: case declension of
0: Result := 'восемьдесят';
1: Result := 'восьмидесяти';
2: Result := 'восьмидесяти';
3: Result := 'восемьдесят';
4: Result := 'восьмьюдесятью';
5: Result := 'восьмидесяти';
end;
9: case declension of
0: Result := 'девяносто';
1: Result := 'девяноста';
2: Result := 'девяноста';
3: Result := 'девяносто';
4: Result := 'девяноста';
5: Result := 'девяноста';
end;
end;
end;
function number90_ord(decades: integer; gender: integer; declension: integer): string;
begin
case decades of
0,1:;
2: Result := 'двадцат' + Adjective1(gender,declension);
3: Result := 'тридцат' + Adjective1(gender,declension);
4: Result := 'сороков' + Adjective2(gender,declension);
5: Result := 'пятидесят' + Adjective1(gender,declension);
6: Result := 'шестидесят' + Adjective1(gender,declension);
7: Result := 'седидесят' + Adjective1(gender,declension);
8: Result := 'восьмидесят' + Adjective1(gender,declension);
9: Result := 'девяност' + Adjective1(gender,declension);
end;
end;
function number19(number: integer; declension: integer): string;
var
p1,p2: string;
begin
case declension of
0: p2 := 'надцать';
1: p2 := 'надцати';
2: p2 := 'надцати';
3: p2 := 'надцать';
4: p2 := 'надцатью';
5: p2 := 'надцати';
end;
case number of
11: p1 := 'один';
12: p1 := 'две';
13: p1 := 'три';
14: p1 := 'четыр';
15: p1 := 'пят';
16: p1 := 'шест';
17: p1 := 'семь';
18: p1 := 'восемь';
19: p1 := 'девят';
end;
Result := p1 + p2;
end;
function number19_ord(number: integer; gender: integer; declension: integer): string;
var
p1: string;
begin
case number of
11: p1 := 'один';
12: p1 := 'две';
13: p1 := 'три';
14: p1 := 'четыр';
15: p1 := 'пят';
16: p1 := 'шест';
17: p1 := 'семь';
18: p1 := 'восемь';
19: p1 := 'девят';
end;
Result := Result +'надцат'+Adjective1(gender,declension)
end;
function number9(number: integer; gender: integer; declension: integer): string;
begin
case number of
0:;
1: case declension of
0: case gender of
0: Result := 'один';
1: Result := 'одна';
2: Result := 'одно';
end;
1: case gender of
0: Result := 'одного';
1: Result := 'одной';
2: Result := 'одного';
end;
2: case gender of
0: Result := 'одному';
1: Result := 'одной';
2: Result := 'одному';
end;
3: case gender of
0: Result := 'один';
1: Result := 'одну';
2: Result := 'одно';
end;
4: case gender of
0: Result := 'одним';
1: Result := 'одной';
2: Result := 'одним';
end;
5: case gender of
0: Result := 'одном';
1: Result := 'одной';
2: Result := 'одном';
end;
end;
2: case declension of
0: case gender of
0,2: Result := 'два';
1: Result := 'две';
end;
1: Result := 'двух';
2: Result := 'двум';
3: Result := 'двух';
4: Result := 'двумя';
5: Result := 'двух';
end;
3: case declension of
0: Result := 'три';
1: Result := 'трех';
2: Result := 'трем';
3: Result := 'три';
4: Result := 'тремя';
5: Result := 'трех';
end;
4: case declension of
0: Result := 'четыре';
1: Result := 'четырех';
2: Result := 'четырем';
3: Result := 'четыре';
4: Result := 'четырьмя';
5: Result := 'четырех';
end;
5: case declension of
0: Result := 'пять';
1: Result := 'пяти';
2: Result := 'пяти';
3: Result := 'пять';
4: Result := 'пятью';
5: Result := 'пяти';
end;
6: case declension of
0: Result := 'шесть';
1: Result := 'шести';
2: Result := 'шести';
3: Result := 'шесть';
4: Result := 'шестью';
5: Result := 'шести';
end;
7: case declension of
0: Result := 'семь';
1: Result := 'семи';
2: Result := 'семи';
3: Result := 'семь';
4: Result := 'семью';
5: Result := 'семи';
end;
8: case declension of
0: Result := 'восемь';
1: Result := 'восьми';
2: Result := 'восьми';
3: Result := 'восемь';
4: Result := 'восемью';
5: Result := 'восьми';
end;
9: case declension of
0: Result := 'девять';
1: Result := 'девяти';
2: Result := 'девяти';
3: Result := 'девять';
4: Result := 'девятью';
5: Result := 'девяти';
end;
end;
end;
function number9_ord(number: integer; gender: integer; declension: integer): string;
begin
case number of
1: result := 'перв' + Adjective1(gender,declension);
2: result := 'втор' + Adjective2(gender,declension);
3: result := 'трет' + Adjective3(gender,declension);
4: result := 'четверт' + Adjective1(gender,declension);
5: result := 'пят' + Adjective1(gender,declension);
6: result := 'шест' + Adjective2(gender,declension);
7: result := 'седьм' + Adjective2(gender,declension);
8: result := 'восьм' + Adjective2(gender,declension);
9: result := 'девят' + Adjective1(gender,declension);
end;
end;
function number999(number: integer; gender: integer; declension: integer): string;
begin
result := number900(number div 100, declension);
number := number mod 100;
case number of
0..9: result := result + ' ' + number9(number,gender,declension);
11..19: result := result + ' ' + number19(number,declension);
else begin
result := result +' '+ number90(number div 10,declension);
number := number mod 10;
result := result +' '+ number9(number,gender,declension);
end;
end;
end;
function number999_ord(number: integer; gender: integer; declension: integer): string;
var
top,rem: integer;
begin
top := number div 100;
rem := number mod 100;
if rem = 0 then
begin
result := number900_ord(top,gender,declension);
exit;
end;
result := number900(top,0);
top := rem;
rem := top mod 10;
case top of
1..9: result := result + ' ' + number9_ord(top,gender,declension);
11..19: result := result + ' ' + number19_ord(top,gender,declension);
else begin
if rem = 0 then
result := result +' '+ number90_ord(top div 10,gender,declension)
else
result := result +' '+ number90(top div 10, 0) + ' ' + number9_ord(rem,gender,declension);
end;
end;
end;
end.