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......