← Назад к вопросам
Функция преобразования числа в прописное написание
2.0 Middle🔥 151 комментариев
#Стандарты разработки
Условие
Реализуйте функцию, которая преобразует число в строку с прописным написанием (число прописью).
Требования:
- Поддержка чисел от 0 до 999 999 999 999
- Правильные окончания (один рубль, два рубля, пять рублей)
- Учёт копеек
- Возможность указать валюту
Пример
Вход: 12345.67, "RUB" Выход: "Двенадцать тысяч триста сорок пять рублей 67 копеек"
Вход: 1, "USD" Выход: "Один доллар 00 центов"
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Решение
Основная функция
Функция ЧислоПрописью(Число, Валюта = "RUB") Экспорт
ПолныхРублей = Целое(Число);
Копейки = Окр((Число - ПолныхРублей) * 100, 0);
// Формируем текст рублей
ТекстРублей = КонвертироватьЧисловПрописное(ПолныхРублей);
// Получаем слово рубль/рубля/рублей
СловоВалюты = ПолучитьСловоВалюты(Валюта, ПолныхРублей, Истина);
ТекстРублей = ТекстРублей + " " + СловоВалюты;
// Формируем текст копеек
СловоКопеек = ПолучитьСловоВалюты(Валюта, Копейки, Ложь);
ТекстКопеек = Формат(Копейки, "ЧЗ=0; ЧДЗ=0") + " " + СловоКопеек;
Возврат ТекстРублей + " " + ТекстКопеек;
КонецФункции
Функция КонвертироватьЧисловПрописное(Число)
Если Число = 0 Тогда
Возврат "Ноль";
КонецЕсли;
Единицы = Новый Массив();
ЕдиницыПоЗначению = Новая Карта();
ЕдиницыПоЗначению[1] = "Один";
ЕдиницыПоЗначению[2] = "Два";
ЕдиницыПоЗначению[3] = "Три";
ЕдиницыПоЗначению[4] = "Четыре";
ЕдиницыПоЗначению[5] = "Пять";
ЕдиницыПоЗначению[6] = "Шесть";
ЕдиницыПоЗначению[7] = "Семь";
ЕдиницыПоЗначению[8] = "Восемь";
ЕдиницыПоЗначению[9] = "Девять";
Десятки = Новая Карта();
ДесяткиПоЗначению[10] = "Десять";
ДесяткиПоЗначению[11] = "Одиннадцать";
ДесяткиПоЗначению[12] = "Двенадцать";
ДесяткиПоЗначению[13] = "Тринадцать";
ДесяткиПоЗначению[14] = "Четырнадцать";
ДесяткиПоЗначению[15] = "Пятнадцать";
ДесяткиПоЗначению[16] = "Шестнадцать";
ДесяткиПоЗначению[17] = "Семнадцать";
ДесяткиПоЗначению[18] = "Восемнадцать";
ДесяткиПоЗначению[19] = "Девятнадцать";
ДесяткиОсновные = Новая Карта();
ДесяткиОсновные[20] = "Двадцать";
ДесяткиОсновные[30] = "Тридцать";
ДесяткиОсновные[40] = "Сорок";
ДесяткиОсновные[50] = "Пятьдесят";
ДесяткиОсновные[60] = "Шестьдесят";
ДесяткиОсновные[70] = "Семьдесят";
ДесяткиОсновные[80] = "Восемьдесят";
ДесяткиОсновные[90] = "Девяносто";
Сотни = Новая Карта();
Сотни[100] = "Сто";
Сотни[200] = "Двести";
Сотни[300] = "Триста";
Сотни[400] = "Четыреста";
Сотни[500] = "Пятьсот";
Сотни[600] = "Шестьсот";
Сотни[700] = "Семьсот";
Сотни[800] = "Восемьсот";
Сотни[900] = "Девятьсот";
Масштабы = Новый Массив();
Масштабы.Добавить(Новая Структура("Делитель, Слово", 1000000000, "миллиард"));
Масштабы.Добавить(Новая Структура("Делитель, Слово", 1000000, "миллион"));
Масштабы.Добавить(Новая Структура("Делитель, Слово", 1000, "тысяча"));
Результат = "";
ТекущееЧисло = Число;
Для каждого Масштаб Из Масштабы Цикл
ДолиМасштаба = Целое(ТекущееЧисло / Масштаб.Делитель);
Если ДолиМасштаба > 0 Тогда
Результат = Результат + КонвертироватьГруппу(ДолиМасштаба, ЕдиницыПоЗначению, ДесяткиПоЗначению, ДесяткиОсновные, Сотни) + " " + Масштаб.Слово + " ";
ТекущееЧисло = ТекущееЧисло % Масштаб.Делитель;
КонецЕсли;
КонецЦикла;
Если ТекущееЧисло > 0 Тогда
Результат = Результат + КонвертироватьГруппу(ТекущееЧисло, ЕдиницыПоЗначению, ДесяткиПоЗначению, ДесяткиОсновные, Сотни) + " ";
КонецЕсли;
Возврат СтрТримр(Результат);
КонецФункции
Функция КонвертироватьГруппу(ГруппаЧисла, ЕдиницыМап, ДесяткиМап, ДесяткиОсновныеМап, СотниМап)
Результат = "";
Сотни = Целое(ГруппаЧисла / 100) * 100;
Если Сотни > 0 Тогда
Результат = Результат + СотниМап[Сотни] + " ";
КонецЕсли;
Остаток = ГруппаЧисла % 100;
Если Остаток >= 10 И Остаток <= 19 Тогда
Результат = Результат + ДесяткиМап[Остаток] + " ";
Иначе
ДесяткиЧасть = Целое(Остаток / 10) * 10;
ЕдиницыЧасть = Остаток % 10;
Если ДесяткиЧасть > 0 Тогда
Результат = Результат + ДесяткиОсновныеМап[ДесяткиЧасть] + " ";
КонецЕсли;
Если ЕдиницыЧасть > 0 Тогда
Результат = Результат + ЕдиницыМап[ЕдиницыЧасть] + " ";
КонецЕсли;
КонецЕсли;
Возврат СтрТримр(Результат);
КонецФункции
Функция ПолучитьСловоВалюты(Валюта, Число, ЭтоОсновнаяВалюта)
АбсолютноеЧисло = Целое(Число);
ОстатокОт100 = АбсолютноеЧисло % 100;
ОстатокОт10 = АбсолютноеЧисло % 10;
ПарамВалюты = ПолучитьПарамВалюты(Валюта, ЭтоОсновнаяВалюта);
Если ОстатокОт100 >= 11 И ОстатокОт100 <= 19 Тогда
Возврат ПарамВалюты.ПятьПлюс;
ИначеЕсли ОстатокОт10 = 1 Тогда
Возврат ПарамВалюты.Один;
ИначеЕсли ОстатокОт10 >= 2 И ОстатокОт10 <= 4 Тогда
Возврат ПарамВалюты.ДваЧетыре;
Иначе
Возврат ПарамВалюты.ПятьПлюс;
КонецЕсли;
КонецФункции
Функция ПолучитьПарамВалюты(Валюта, ЭтоОсновнаяВалюта)
ПарамВалют = Новая Карта();
ПарамRUB = Новая Структура();
ПарамRUB.Один = ?(ЭтоОсновнаяВалюта, "рубль", "копейка");
ПарамRUB.ДваЧетыре = ?(ЭтоОсновнаяВалюта, "рубля", "копейки");
ПарамRUB.ПятьПлюс = ?(ЭтоОсновнаяВалюта, "рублей", "копеек");
ПарамВалют["RUB"] = ПарамRUB;
ПарамUSD = Новая Структура();
ПарамUSD.Один = ?(ЭтоОсновнаяВалюта, "доллар", "цент");
ПарамUSD.ДваЧетыре = ?(ЭтоОсновнаяВалюта, "доллара", "цента");
ПарамUSD.ПятьПлюс = ?(ЭтоОсновнаяВалюта, "долларов", "центов");
ПарамВалют["USD"] = ПарамUSD;
ПарамEUR = Новая Структура();
ПарамEUR.Один = ?(ЭтоОсновнаяВалюта, "евро", "цент");
ПарамEUR.ДваЧетыре = ?(ЭтоОсновнаяВалюта, "евро", "цента");
ПарамEUR.ПятьПлюс = ?(ЭтоОсновнаяВалюта, "евро", "центов");
ПарамВалют["EUR"] = ПарамEUR;
Если ПарамВалют.Получить(Валюта) <> Неопределено Тогда
Возврат ПарамВалют[Валюта];
Иначе
Возврат ПарамВалют["RUB"];
КонецЕсли;
КонецФункции
Примеры использования
Сообщить(ЧислоПрописью(12345.67, "RUB"));
// Выход: Двенадцать тысяч триста сорок пять рублей 67 копеек
Сообщить(ЧислоПрописью(1, "USD"));
// Выход: Один доллар 0 центов
Сообщить(ЧислоПрописью(0, "RUB"));
// Выход: Ноль рублей 0 копеек
Сообщить(ЧислоПрописью(101.01, "EUR"));
// Выход: Сто один евро 1 цент
Ключевые моменты
- Правильные окончания согласно русской грамматике
- Поддержка разных валют
- Учёт копеек/центов
- Обработка нулей
- Масштабируемость для других валют