DIGIT.PAS

{* Сумма Прописью *}

Unit DIGIT;
Interface
Implementation
Begin
 writeln('Функция "Сумма прописью" from Ruslan Nurislamov ');
End.

Program pas;

Uses DIGIT.pas; {* Эту строку можно удалить *}
Unit Digit;
Interface
Function Sum2Txt(L : LongInt) : String;
Implementation
Const {* Предопределенные *}
  Rub     : Array[0..10] Of String[20] = ('', 'рубль', 'рубля', 'рубля', 'рубля',             'рублей', 'рублей', 'рублей', 'рублей', 'рублей', 'рублей');
  Tho     : Array[0..10] Of String[20] = ('', 'тысяча', 'тысячи', 'тысячи',             'тысячи', 'тысяч', 'тысяч', 'тысяч', 'тысяч', 'тысяч', 'тысяч');
  Mill    : Array[0..10] Of String[20] = ('', 'миллион', 'миллиона', 'миллиона',             'миллиона', 'миллионов', 'миллионов', 'миллионов',             'миллионов', 'миллионов', 'миллионов');
  Milr    : Array[0..2] Of String[20] = ('', 'миллиард', 'миллиарда');
  Digit1  : Array[0..9] Of String[20] = ('', 'сто', 'двести', 'триста', 'четыреста',             'пятьсот', 'шестьсот', 'семьсот', 'восемьсот', 'девятьсот');
  Digit21 : Array[0..9] Of String[20] = ('десять', 'одиннадцать', 'двенадцать',             'тринадцать', 'четырнадцать', 'пятнадцать',             'шестнадцать', 'семнадцать', 'восемнадцать', 'девятнадцать');
  Digit2  : Array[0..9] Of String[20] = ('', '', 'двадцать', 'тридцать', 'сорок',             'пятьдесят', 'шестьдесят', 'семьдесят', 'восемьдесят', 'девяносто');
  Digit3  : Array[0..9] Of String[20] = ('', 'один', 'два', 'три', 'четыре', 'пять',             'шесть', 'семь', 'восемь', 'девять');
  Digit3t : Array[0..9] Of String[20] = ('', 'одна', 'две', 'три', 'четыре', 'пять',             'шесть', 'семь', 'восемь', 'девять');
Var {* Объявление переменных *}
  S                  : String;
  L                  : LongInt;
Function Sum2Txt(L : LongInt);
Var {* В работе нам потребуются переменные: *}
  St    : Array[1..4] Of String[3];
  I     : Byte;
  N     : Byte;
  J     : Byte;
  Code  : Integer;
  Sum   : String;
  Sumt  : String;
  OkAdd : Boolean;
Begin
  If L = 0 Then
  Begin
    Sum2Txt := 'ноль рублей';
    Exit;
  End;
  Str(L, S);
  St[1] := '000';
  St[2] := '000';
  St[3] := '000';
  St[4] := '000';
  While (Length(S) Mod 3)0 Do
    S := '0' + S;
  I := Length(S);
  N := 1;
  While I > = 1 Do
  Begin
    St[N] := St[N] + S[I];
    Dec(I); {* Уменьшаем I на 1 *}
    If ((Length(S) - I) Mod 3) = 0 Then
      Inc(N); {* Увеличиваем N на 1 *}
  End;
  Begin
    conversion 3 - byte arrays To a String value }
    Sumt := '';
    For I := 1 To 4 Do {* Увеличиваем I от 1 до 4 с шагом 1 *}
    Begin
      Sum := '';
      Val(St[I][3], N, Code);
      Sum := Sum + Digit1[N];
      If Digit1[N]'' Then
        Sum := Sum + ' ';
      If St[I][2] = '1' Then
      Begin
        OkAdd := False;
        Val(St[I][1], N, Code);
        Sum := Sum + Digit21[N] + ' ';
        N := 10;
      End;
      Else Begin
        Val(St[I][2], N, Code);
      Sum := Sum + Digit2[N];
      If Digit2[N]'' Then
        Sum := Sum + ' ';
      Val(St[I][1], N, Code);
      Case I Of        1:
      Begin
        Sum := Sum + Digit3[N];
        If Digit3[N]'' Then
          Sum := Sum + ' ';
      End;
      2:
      Begin
        Sum := Sum + Digit3t[N];
        If Digit3t[N]'' Then
          Sum := Sum + ' ';
      End;
      3:
      Begin
        Sum := Sum + Digit3[N];
        If Digit3[N]'' Then
          Sum := Sum + ' ';
      End;
      4:
      Begin
        Sum := Sum + Digit3[N];
        If Digit3[N]'' Then
          Sum := Sum + ' ';
      End;
      
    End;
    
  End;
  Case I Of      1:
    If Sum'' Then
      Sumt := Rub[N] + Sumt;
  2:
  If Sum'' Then
    Sumt := Tho[N] + ' ' + Sumt;
  3:
  If Sum'' Then
    Sumt := Mill[N] + ' ' + Sumt;
  4:
  If Sum'' Then
    Sumt := Milr[N] + ' ' + Sumt;
End;
  Sumt := Sum + Sumt;
  End;
For I := Length(Sumt) - 2 Downto 1 Do
  If Sumt[I] = ' ' Then
    Begin
J := I;
Break;
End;
Sum := Copy(Sumt, J + 1, 4);
If Sum'рубл' Then
  Sumt := Sumt + 'рублей';
Sum2Txt := Sumt;
End;
Begin
End......