{$I KEYS }

unit RupUnit;

interface
function EqStrRup(var s1,s2 :string) :boolean;
function StrNum(R :longint) :string;


const RupTab :array [char] of char =
(
#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, #52, #53, #54, #55,
#56, #57, #58, #59, #60, #61, #62, #63,
#64, #65, #66, #67, #68, #69, #70, #71,
#72, #73, #74, #75, #76, #77, #78, #79,
#80, #81, #82, #83, #84, #85, #86, #87,
#88, #89, #90, #91, #92, #93, #94, #95,
#96, #65, #66, #67, #68, #69, #70, #71,
#72, #73, #74, #75, #76, #77, #78, #79,
#80, #81, #82, #83, #84, #85, #86, #87,
#88, #89, #90, #123, #124, #125, #126, #127,
#65, #129, #66, #131, #132, #69, #134, #135,
#136, #137, #75, #139, #77, #72, #79, #143,
#80, #67, #84, #147, #148, #88, #150, #151,
#152, #153, #154, #155, #156, #157, #158, #159,
#65, #129, #66, #131, #132, #69, #134, #135,
#136, #137, #75, #139, #77, #72, #79, #143,
#176, #177, #178, #179, #180, #181, #182, #183,
#184, #185, #186, #187, #188, #189, #190, #191,
#192, #193, #194, #195, #196, #197, #198, #199,
#200, #201, #202, #203, #204, #205, #206, #207,
#208, #209, #210, #211, #212, #213, #214, #215,
#216, #217, #218, #219, #220, #221, #222, #223,
#80, #67, #84, #147, #148, #88, #150, #151,
#152, #153, #154, #155, #156, #157, #158, #159,
#240, #241, #242, #243, #244, #245, #246, #247,
#248, #249, #250, #251, #252, #253, #254, #255);


implementation
uses Interna;

function EqStrRup(var s1,s2 :string) :boolean;
label 1,2,L,EX;
var i,j, ii,jj :integer; b :boolean;
begin
   b:=true;

   for ii:=length(s1) downto 1 do if s1[ii] <> ' ' then goto 1;
   b:=false; goto EX;

1: for jj:=length(s2) downto 1 do if s2[jj] <> ' ' then goto 2;
   b:=false; goto EX;

2: i:=1; j:=1;

L: if s1[i]='\' then begin inc(i); goto L end;
   if s2[j]='\' then begin inc(j); goto L end;

   if RupTab[s1[i]] <> RupTab[s2[j]]
   then begin b:=false; goto EX end;


   if i=ii
   then if j=jj
        then goto EX
        else begin b:=false; goto EX end;

   if j=jj then begin b:=false; goto EX end;

   inc(i); inc(j);
   goto L;

EX:
   EqStrRup:=b
end;


type Sex = (male,female);


function StrNumS(R :longint; f :Sex) :string;
var N,L :longint; s :string;

const D0 :array [0..19] of string[20]
  = ('', its_61001 
{ 'один' }
, its_61002 
{ 'два' }
, its_61003 
{ 'тpи' }
, its_61004 
{ 'четыpе' }
, its_61005 
{ 'пять' }
, its_61006 
{ 'шесть' }
, its_61007 
{ 'семь' }
, its_61008 
{ 'восемь' }
, its_61009 
{ 'девять' }
,
      its_61010 
{ 'десять' }
, its_61011 
{ 'одиннадцать' }
, its_61012 
{ 'двенадцать' }
, its_61013 
{ 'тpинадцать' }
, its_61014
{ 'четыpнадцать' }
,
      its_61015 
{ 'пятнадцать' }
, its_61016 
{ 'шестнадцать' }
, its_61017 
{ 'семнадцать' }
, its_61018 
{ 'восемнадцать' }
, its_61019 
{ 'девятнадцать' }
);

      D1 :array [1..9] of string[20]
  = ( its_61020 
{ 'десять' }
, its_61021 
{ 'двадцать' }
, its_61022 
{ 'тpидцать' }
, its_61023 
{ 'соpок' }
, its_61024 
{ 'пятьдесят' }
, its_61025 
{ 'шестьдесят' }
,
      its_61026 
{ 'семьдесят' }
, its_61027 
{ 'восемьдесят' }
, its_61028 
{ 'девяносто' }
);

      D2 :array [1..9] of string[20]
  = ( its_61029 
{ 'сто' }
, its_61030 
{ 'двести' }
, its_61031 
{ 'тpиста' }
, its_61032 
{ 'четыpеста' }
, its_61033 
{ 'пятьсот' }
, its_61034 
{ 'шестьсот' }
,
      its_61035 
{ 'семьсот' }
, its_61036 
{ 'восемьсот' }
, its_61037 
{ 'девятьсот' }
);


var sss1, sss2 :string;

begin
if R < 0            then StrNumS:= its_61038 
{ 'Минус ' }
+ StrNumS(-R,f)

else if R = 0       then StrNumS:=''

else if R <= 19     then begin
                         StrNumS:=D0[R]+' ';
                         if f=female
                         then if      R = 1 then StrNumS:= its_61039 
{ 'одна ' }

                              else if R = 2 then StrNumS:= its_61040 
{ 'две ' }
;
                         end

else if R <=  99    then StrNumS:=D1[R div 10] + ' ' + StrNumS(R mod 10,f)

else if R <= 999    then begin
                         sss1:=D2[R div 100];
                         sss2:=StrNumS(R mod 100,f);
                         if (sss1 <> '') and (sss2 <> '')
                         then StrNumS:=sss1 + its_61100 + sss2
                         else StrNums:=sss1 + ' ' + sss2;
                         {
                         StrNumS:=D2[R div 100] + ' ' + StrNumS(R mod 100,f)
                         }
                         end

else if R <= 999999 then begin
                         L:=R div 1000;
                         N:=L mod 10;
                         s:= its_61041 
{ 'тысяч ' }
;
                         if N = 1 then s:= its_61042 
{ 'тысяча ' }
;
                         if N in [2,3,4] then s:= its_61043 
{ 'тысячи ' }
;
                         if (L mod 100) in [11,12,13,14]
                         then s:= its_61044 
{ 'тысяч ' }
;
                         StrNumS:=StrNumS(L,female) + s +
                                  StrNumS(R mod 1000,f);
                         end

else if R <= 999999999
                    then begin
                         L:=R div 1000000;
                         N:=L mod 10;
                         s:= its_61045 
{ 'миллионов ' }
;
                         if N = 1 then s:= its_61046 
{ 'миллион ' }
;
                         if N in [2,3,4] then s:= its_61047 
{ 'миллиона ' }
;
                         if (L mod 100) in [11,12,13,14]
                         then s:= its_61048 
{ 'миллионов ' }
;
                         StrNumS:=StrNumS(L,male) + s +
                                  StrNumS(R mod 1000000,f);
                         end

else if R <= 1999999999
                   then StrNumS:= its_61049 
{ 'Один миллиаpд ' }
 +
                        StrNumS(R mod 1000000000,f)

else StrNumS:='****** N > 1,999,999,999 ******';
end;


function StrNum(R :longint) :string;
var t :string;
begin
t:=StrNumS(R,male);
if t <> '' then t[1]:=RupTab[t[1]] else t:=' ';
StrNum:=t;
end;


begin
end.