Главная страницаОбратная связьКарта сайта

Сумма прописью - Способ 9


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] of string[7];
  tns = array[0..9] of string[13];
  decs = array[0..9] of string[12];
  huns = array[0..9] of string[10];
  nums = array[0..4] of string[8];
  money = array[1..2] of string[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 div 10) mod 10) <> 1 then
    case (Arg mod 10) 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 mod 10;
      iTri2 := iTri2 div 10;
    end;

  begin
    iTri := trunc(Nr / IntPower(1000, i));
    Nr := Nr - int(iTri * IntPower(1000, i));
    iTri2 := iTri;
    if iTri > 0 then
    begin
      un := GetDigit;
      de := GetDigit;
      ce := GetDigit;
      if i = 1 then
        g := f
      else
        g := m; {женского рода только тысяча}

      str := TrimRight(str) + " " + Hundreds[ce];
      if de = 1 then
        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]) > 1 then
      begin
        str := TrimRight(str) + " " + numericals[i];
        str := TrimRight(str) + ends[g, 1, EndingIndex(iTri)];
      end;
    end; //triad is 0 ?

    if i = 0 then
      Exit;
    Dec(i);
    Triad;
  end;

begin

  str := "";
  Nr := int(Nin);
  Fr := round(Nin * 100 + 0.00000001) mod 100;
  if Nr > 0 then
    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.


Обсудить статью на форуме


Если Вас заинтересовала или понравилась информация по разработке на Delph - "Сумма прописью - Способ 9", Вы можете поставить закладку в социальной сети или в своём блоге на данную страницу:

Так же Вы можете задать вопрос по работе этого модуля или примера через форму обратной связи, в сообщение обязательно указывайте название или ссылку на статью!
   


Copyright © 2008 - 2024 Дискета.info