{------------------------ Деньги прописью ---------------------}function TextSum(S: double): string;
function Conv999(M: longint; fm: integer): string;
const
c1to9m: array[1..9] ofstring[6] =
('один', 'два', 'три', 'четыре', 'пять', 'шесть', 'семь', 'восемь',
'девять');
c1to9f: array[1..9] ofstring[6] =
('одна', 'две', 'три', 'четыре', 'пять', 'шесть', 'семь', 'восемь',
'девять');
c11to19: array[1..9] ofstring[12] =
('одиннадцать', 'двенадцать', 'тринадцать', 'четырнадцать', 'пятнадцать',
'шестнадцать', 'семнадцать', 'восемнадцать', 'девятнадцать');
c10to90: array[1..9] ofstring[11] =
('десять', 'двадцать', 'тридцать', 'сорок', 'пятьдесят', 'шестьдесят',
'семьдесят', 'восемьдесят', 'девяносто');
c100to900: array[1..9] ofstring[9] =
('сто', 'двести', 'триста', 'четыреста', 'пятьсот', 'шестьсот', 'семьсот',
'восемьсот', 'девятьсот');
var
s: string;
i: longint;
begin
s := '';
i := M div 100;
if i <> 0 then
s := c100to900[i] + ' ';
M := M mod 100;
i := M div 10;
if (M > 10) and (M < 20) then
s := s + c11to19[M - 10] + ' '
elsebeginif i <> 0 then
s := s + c10to90[i] + ' ';
M := M mod 10;
if M <> 0 thenif fm = 0 then
s := s + c1to9f[M] + ' '
else
s := s + c1to9m[M] + ' ';
end;
Conv999 := s;
end;
{--------------------------------------------------------------}var
i: longint;
j: longint;
r: real;
t: string;
begin
t := '';
j := Trunc(S / 1000000000.0);
r := j;
r := S - r * 1000000000.0;
i := Trunc(r);
if j <> 0 thenbegin
t := t + Conv999(j, 1) + 'миллиард';
j := j mod 100;
if (j > 10) and (j < 20) then
t := t + 'ов '
elsecase j mod 10 of
0: t := t + 'ов ';
1: t := t + ' ';
2..4: t := t + 'а ';
5..9: t := t + 'ов ';
end;
end;
j := i div 1000000;
if j <> 0 thenbegin
t := t + Conv999(j, 1) + 'миллион';
j := j mod 100;
if (j > 10) and (j < 20) then
t := t + 'ов '
elsecase j mod 10 of
0: t := t + 'ов ';
1: t := t + ' ';
2..4: t := t + 'а ';
5..9: t := t + 'ов ';
end;
end;
i := i mod 1000000;
j := i div 1000;
if j <> 0 thenbegin
t := t + Conv999(j, 0) + 'тысяч';
j := j mod 100;
if (j > 10) and (j < 20) then
t := t + ' '
elsecase j mod 10 of
0: t := t + ' ';
1: t := t + 'а ';
2..4: t := t + 'и ';
5..9: t := t + ' ';
end;
end;
i := i mod 1000;
j := i;
if j <> 0 then
t := t + Conv999(j, 1);
t := t + 'руб. ';
i := Round(Frac(S) * 100.0);
t := t + Long2Str(i) + ' коп.';
TextSum := t;
end;
Программа на Паскале для конвертации десятичного числа в его письменную форму на русском языке, включая сумму денег. Программа использует различные массивы и константы для определения слов для чисел от 1 до 999 и их соответствующих десятков и сотен мест.
Рассмотрим, как работает программа:
Функция TextSum принимает дробное значение в качестве входного параметра и возвращает его письменную форму в виде строки.
Функция сначала вычисляет сотню место используя целочисленное деление (M div 100) и хранит результат в переменной i. Если i не равно нулю, она добавляет соответствующее слово из массива c100to900 к строке результата.
Затем функция вычисляет остаток от деления (M mod 100) и присваивает его обратно M.
Функция затем проверяет, является ли M между 10 и 19 (включительно). Если так, она добавляет соответствующее слово из массива c11to19 к строке результата.
В противном случае функция вычисляет десятки место используя целочисленное деление (M div 10) и хранит результат в переменной i. Если i не равно нулю, она добавляет соответствующее слово из массива c10to90 к строке результата. Затем функция вычисляет остаток от деления (M mod 10) и присваивает его обратно M.
Наконец, если M не равно нулю, она добавляет соответствующее слово из массива c1to9m или c1to9f (в зависимости от значения fm) к строке результата.
Программа затем использует схожий подход для конвертации вводного числа в его письменную форму на русском языке, включая сумму денег.
Некоторые предложения по улучшению:
Рассмотрите добавление более надежной обработки ошибок и валидации для обеспечения того, что входное значение является валидным десятичным числом.
Используйте более описательные имена переменных для улучшения понимания кода.
Вместо использования Long2Str для конвертации целого числа в строку, можно использовать функцию IntToStr, предоставленную Паскалем.
Программа использует много повторов в своей логике. Рассмотрите рефакторинг для уменьшения дублирования и улучшения читаемости.
В качестве альтернативного решения можно рассмотреть использование более объектно-ориентированного подхода, где каждый цифра (0-9) представлена как объект с своими свойствами и методами. Это позволит легко расширить программу для поддержки более сложных форматов чисел или языков.
Данная статья описывает функцию для преобразования чисел в прописную форму на русском языке, используя алгоритм, который разбивает число на миллиарды, миллионы и тысячи.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.