num2words 
📦 num2words — Ruby-гем для преобразования чисел в строковое представление (прописью).
✨ Основные возможности
- Поддержка чисел, времени, дат и валют:
Integer→123.to_words(:ru)→"сто двадцать три"Float→12.5.to_words(:en)→"twelve and five tenths"Time / DateTime→"2024-08-21 14:35:42".to_words(:ru, :time)→"четырнадцать часов тридцать пять минут сорок две секунды"Float.to_currency→12.5.to_currency(:ru)→"двенадцать рублей пятьдесят копеек"
- Кастомизация вывода:
- Краткая форма (
short: true) →"четырнадцать часов тридцать пять минут" - Форматы времени (
:hours_only,:hours_minutes,:hours_minutes_seconds) - Выбор локали:
:ru,:en(из коробки), легко расширить YAML-файлами
- Краткая форма (
- Расширение Integer, Float, Date, Time, DateTime удобными методами.
- Локали инициализируются только при обращении к ним (
lazy loading) черезlib/num2words/locales.rb. - Унифицированный
Converter, делегирующий работу нужной локали. - Настраиваемые правила разрядов чисел и валют через I18n YAML.
📦 Установка
Добавьте в Gemfile:
gem "num2words"
Или установите напрямую:
gem install num2words
🚀 Быстрый старт
require "num2words"
🔢 Числа
# Integer
123.to_words(:ru) # => "сто двадцать три"
123.to_words(:en) # => "one hundred twenty three"
# Float
45.67.to_words(:ru) # => "сорок пять целых шестьдесят семь сотых"
45.67.to_words(:en) # => "forty five and sixty seven hundredths"
💰 Валюта
21.05.to_currency(:ru) # => "двадцать один рубль пять копеек"
12.5.to_currency(:en) # => "twelve dollars fifty cents"
📅 Дата
"2024-08-21".to_words(:ru, :date)
# => "двадцать первое августа две тысячи двадцать четвертого года"
"2024-08-21".to_words(:en, :date)
# => "the twenty-first of August, two thousand twenty four"
⏰ Время
"14:35:42".to_words(:ru, :time)
# => "четырнадцать часов тридцать пять минут сорок две секунды"
"14:35:42".to_words(:ru, :time, short: true) # или короткая запись: "14:35:42".to_words(:ru, :time, true)
# => "четырнадцать часов тридцать пять минут"
"14:35:42".to_words(:en, :time)
# => "fourteen hours thirty five minutes forty two seconds"
🕓 Дата и время
"2024-08-21 14:35:42".to_words(:ru)
# => "двадцать первого августа две тысячи двадцать четвёртого года, четырнадцать часов тридцать пять минут сорок две секунды"
"2024-08-21 14:35:42".to_words(:en)
# => "the twenty-first of August, two thousand twenty four at fourteen hours thirty five minutes forty two seconds"
⚙️ Опции
locale: :ru | :en— язык (по умолчанию берётся I18n.locale или :ru).:date, :time, :datetime— формат преобразования для строк.short: true— краткая форма для даты/времени.Num2words.to_words(number, locale: :en)— универсальный способ вызова без расширения базовых классов.Num2words.to_currency(number)— преобразование число в валюту.
Консоль 💻
Num2words поддерживает интерактивную консоль для быстрого тестирования.
Это удобно при работе с разными числами и языками.
Запуск консоли
bin/console
После запуска появится приветственное сообщение:
👋 Добро пожаловать в консоль num2words!
Попробуйте: Num2words.to_words(2025)
-----------------------------------------------------
👉 Это позволяет проверять работу гема без написания отдельных скриптов.
🌍 Доступные локали (из коробки)
| Язык | ISO-код | Валюта | Файл |
|---|---|---|---|
| Английский | en | USD ($) | en.yml |
| Русский | ru | RUB (₽) | ru.yml |
| Китайский | zh | CNY (¥) | zh.yml |
| Испанский | es | EUR (€) | es.yml |
| Французский | fr | EUR (€) | fr.yml |
| Немецкий | de | EUR (€) | de.yml |
| Итальянский | it | EUR (€) | it.yml |
| Португальский | pt | EUR (€) | pt.yml |
| Арабский | ar | SAR (﷼) | ar.yml |
| Хинди | hi | INR (₹) | hi.yml |
| Японский | ja | JPY (¥) | ja.yml |
| Корейский | ko | KRW (₩) | ko.yml |
| Турецкий | tr | TRY (₺) | tr.yml |
| Нидерландский | nl | EUR (€) | nl.yml |
| Польский | pl | PLN (zł) | pl.yml |
| Украинский | uk | UAH (₴) | uk.yml |
| Чешский | cs | CZK (Kč) | cs.yml |
| Румынский | ro | RON (lei) | ro.yml |
| Болгарский | bg | BGN (лв) | bg.yml |
| Белорусский | be | BYN (Br) | be.yml |
| Казахский | kz | KZT (₸) | kz.yml |
| Греческий | el | EUR (€) | el.yml |
| Иврит | he | ILS (₪) | he.yml |
| Шведский | sv | SEK (kr) | sv.yml |
| Норвежский | nb | NOK (kr) | nb.yml |
| Датский | da | DKK (kr) | da.yml |
| Финский | fi | EUR (€) | fi.yml |
| Венгерский | hu | HUF (Ft) | hu.yml |
| Тайский | th | THB (฿) | th.yml |
| Вьетнамский | vi | VND (₫) | vi.yml |
| Индонезийский | id | IDR (Rp) | id.yml |
| Персидский | fa | IRR (﷼) | fa.yml |
| Сербский | sr | RSD (дин) | sr.yml |
| Хорватский | hr | EUR (€) | hr.yml |
| Словацкий | sk | EUR (€) | sk.yml |
| Словенский | sl | EUR (€) | sl.yml |
| Литовский | lt | EUR (€) | lt.yml |
| Латышский | lv | EUR (€) | lv.yml |
| Эстонский | et | EUR (€) | et.yml |
| Малайский | ms | MYR (RM) | ms.yml |
| Бенгальский | bn | BDT (৳) | bn.yml |
| Урду | ur | PKR (₨) | ur.yml |
| Тамильский | ta | INR (₹) | ta.yml |
| Телугу | te | INR (₹) | te.yml |
| Малаялам | ml | INR (₹) | ml.yml |
| Каннада | kn | INR (₹) | kn.yml |
| Маратхи | mr | INR (₹) | mr.yml |
| Гуджарати | gu | INR (₹) | gu.yml |
| Панджаби | pa | INR (₹) | pa.yml |
| Суахили | sw | KES (Sh) | sw.yml |
Можно легко добавить новые:
- YAML-файл:
config/locales/xx.yml - Обёртка:
lib/num2words/locales/xx.rb
🌍 Поддержка локалей (ru / en)
| Возможность | ru | en |
|---|---|---|
| 🔢 Числа (Integer) | ✔ | ✔ |
| 🔢 Числа (Float) | ✔ | ✔ |
| 💰 Валюта | ✔ (рубли) | ✔ (rubles) |
| 💰 Валюта (short) | ✖ | ✖ |
| 💱 Выбор валюты (USD/EUR/…) | ✖ | ✖ |
| 📅 Дата | ✔ | ✔ |
| ⏰ Время | ✔ | ✔ |
| 🕓 Дата и время | ✔ | ✔ |
| 📝 Краткая форма даты/времени | ✔ | ✔ |
🧪 Тестирование
bundle exec rspec
📌 Roadmap
- [x] 🇬🇧 Поддержка английского языка
- [x] 🔠 Опция выбора регистра (строчные/Прописные)
- [x] ⏰ Краткая форма даты/времени
- [ ] 💵 Поддержка других валют (USD, EUR и т.д)
- [ ] 💰 Краткая форма валюты