Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

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

Delphi , Синтаксис , Текст и Строки



Автор: Раков Андрей
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'); 

Программная функция Delphi для конвертации денежных сумм в строку!

Эта реализация довольно обширна и охватывает широкий спектр валютных номиналов, от рублей и копеек до дodecillion. Код включает несколько массивов и констант, которые определяют названия чисел, денежные единицы и их множественные формы.

Функция MoneyToStr принимает строковый ввод в формате "DD,CC", где DD - сумма в рублях (без запятых) и CC - сумма в копейках (с ведущей запятой). Функция конвертирует этот ввод в строковое представление суммы, используя правильные названия для каждого номинала.

Вот шаг за шагом, как функция работает:

  1. Она извлекает сумму в рублях и копейках из строки ввода.
  2. Она использует массив Troyka для хранения отдельных цифр суммы в рублях.
  3. Она использует другой массив M1 для хранения названий денежных единиц (например, "тысяча", "миллион" и т.д.).
  4. Функция затем строит строковое представление суммы, конкатенируя названия денежных единиц, числа и множественные формы.

Код включает несколько примеров использования этой функции, включая пример ввода S := MoneyToStr('76576876876976576437654365,98');.

В целом, эта реализация довольно обширна и должна быть в состоянии обработать большинство конвертаций валют с высокой точностью. Однако она может потребовать некоторых модификаций или обновлений для адаптации к конкретным региональным или культурным вариациям названий денежных единиц.

Вот несколько предложений по улучшению:

  • Рассмотрите добавление поддержки отрицательных сумм (например, путем префиксирования строки минусом).
  • Вам может потребоваться добавление обработки ошибок для обработки невалидных форматов ввода.
  • Функция могла быть оптимизирована для производительности с помощью более эффективных алгоритмов или структур данных.
  • Было бы полезно включить документацию или комментарии, объясняющие, как функция работает, и какие предположения она делает о формате ввода.

Надеюсь, это поможет! Позвоните мне, если у вас есть вопросы или вам нужна дополнительная помощь.

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


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Текст и Строки ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-01-28 05:01:51/0.0056378841400146/1