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

Конвертация денежных сумм в строковое выражение

Автор: Раков Андрей
WEB-сайт: http://delphibase.endimus.com

{ **** UBPFD *********** by delphibase.endimus.com ****
>> Конвертация денежных сумм в строковое выражение

Конвертация денежных сумм в строковое выражение впоть до додециллиона,
причем легко наращивается. Небольшая по размеру.

Зависимости: System
Автор:       Раков Андрей, klopmail@mail.ru, Курчатов
Copyright:   Раков А.В.
Дата:        17 августа 2002 г.
***************************************************** }

function MoneyToStr(DD: string): string;
{(С) Раков А.В. 05.2002 e-mail: klopmail@mail.ru сайт: http://www.kursknet.ru/~klop}
type
  TTroyka = array[1..3] of Byte;
  TMyString = array[1..19] of string[12];
var
  S, OutS, S2: string;
  k, L, kk: Integer;
  Troyka: TTroyka;
  V1: TMyString;
  Mb: Byte;
const
  V11: TMyString =
  ("один", "два", "три", "четыре", "пять", "шесть", "семь", "восемь", "девять",
    "десять", "одиннадцать",
    "двенадцать", "тринадцать", "четырнадцать", "пятнадцать", "шестнадцать",
      "семнадцать", "восемнадцать", "девятнадцать");
  V2: array[1..8] of string =
  ("двадцать", "тридцать", "сорок", "пятьдесят", "шестьдесят", "семьдесят",
    "восемьдесят", "девяносто");
  V3: array[1..9] of string =
  ("сто", "двести", "триста", "четыреста", "пятьсот", "шестьсот", "семьсот",
    "восемьсот", "девятьсот");
  M1: array[1..13, 1..3] of string = (("тысяча", "тысячи", "тысяч"),
    ("миллион", "миллиона", "миллионов"),
    ("миллиард", "миллиарда", "миллиардов"),
    ("триллион", "триллиона", "триллионов"),
    ("квадриллион", "квадриллиона", "квадриллионов"),
    ("квинтиллион", "квинтиллиона", "квинтиллионов"),
    ("секстиллион", "секстиллиона", "секстиллионов"),
    ("сентиллион", "сентиллиона", "сентиллионов"),
    ("октиллион", "октиллиона", "октиллионов"),
    ("нониллион", "нониллиона", "нониллионов"),
    ("дециллион", "дециллиона", "дециллионов"),
    ("ундециллион", "ундециллиона", "ундециллионов"),
    ("додециллион", "додециллиона", "додециллионов"));
  R1: array[1..3] of string = ("рубль", "рубля", "рублей");
  R2: array[1..3] of string = ("копейка", "копейки", "копеек");
  function TroykaToStr(L: ShortInt; TR: TTroyka): string;
  var
    S: string;
  begin
    S := "";
    if Abs(L) = 1 then
    begin
      V1[1] := "одна";
      V1[2] := "две";
    end
    else
    begin
      V1[1] := "один";
      V1[2] := "два";
    end;
    if Troyka[2] = 1 then
    begin
      Troyka[2] := 0;
      Troyka[3] := 10 + Troyka[3];
    end;
    if Troyka[3] <> 0 then
      S := V1[Troyka[3]];
    if Troyka[2] <> 0 then
      S := V2[Troyka[2] - 1] + " " + S;
    if Troyka[1] <> 0 then
      S := V3[Troyka[1]] + " " + S;
    if (L > 0) and (S <> "") then
      case Troyka[3] of
        1: S := S + " " + M1[L, 1] + " ";
        2..4: S := S + " " + M1[L, 2] + " ";
      else
        S := S + " " + M1[L, 3] + " ";
      end;
    TroykaToStr := S;
  end;
begin
  V1 := V11;
  L := 0;
  OutS := "";
  kk := Pos(",", DD);
  if kk = 0 then
    S := DD
  else
    S := Copy(DD, 1, kk - 1);
  if S = "0" then
    S2 := ""
  else
    S2 := S;
  repeat
    for k := 3 downto 1 do
      if Length(S) > 0 then
      begin
        Troyka[k] := StrToInt(S[Length(S)]);
        Delete(S, Length(S), 1);
      end
      else
        Troyka[k] := 0;
    OutS := TroykaToStr(L, Troyka) + OutS;
    if L = 0 then
      Mb := Troyka[3];
    Inc(L);
  until Length(S) = 0;
  case Mb of
    0: if Length(S2) > 0 then
        OutS := OutS + " " + R1[3] + " ";
    1: OutS := OutS + " " + R1[1] + " ";
    2..4: OutS := OutS + " " + R1[2] + " ";
  else
    OutS := OutS + " " + R1[3] + " ";
  end;
  S2 := "";
  if kk <> 0 then
  begin
    DD := Copy(DD, kk + 1, 2);
    if Length(DD) = 1 then
      DD := DD + "0";
    k := StrToInt(DD);
    Troyka[1] := 0;
    Troyka[2] := k div 10;
    Troyka[3] := k mod 10;
    S2 := TroykaToStr(-1, Troyka);
    case Troyka[3] of
      0: if Troyka[2] = 0 then
          S := ""
        else
          S := R2[3];
      1: S := R2[1];
      2..4: S := R2[2];
    else
      S := R2[3];
    end;
  end;
  // MoneyToStr:=OutS+IntToStr(k)+" "+S; // если копейки нужны цифрой-эту строку раскоментировать
  MoneyToStr := OutS + S2 + " " + S; // а эту закоментировать
end;

Пример использования:

S := MoneyToStr("76576876876976576437654365,98"); 

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


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

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


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