← Назад к вопросам

Функция преобразования числа в прописное написание

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 цент

Ключевые моменты

  • Правильные окончания согласно русской грамматике
  • Поддержка разных валют
  • Учёт копеек/центов
  • Обработка нулей
  • Масштабируемость для других валют