Skip to content

DivinMA/MoneyToWords

Repository files navigation

💰 MoneyToWords — Сумма прописью

.NET NuGet Build Release License

MoneyToWords — надёжная библиотека на F#, преобразующая числа в текст с правильным склонением:

  • "один рубль",
  • "двадцать одна тысяча",
  • "сто двадцать три миллиона".

💡 Этот проект создан для изучения F#, принципов функционального программирования, механизмов GitHub и паттернов проектирования. Выполнен по принципам production-ready кода:

  • полное тестирование,
  • чистая архитектура,
  • документация
  • готовность к использованию в реальных системах.

Подходит для:

  • Формирования банковских документов
  • Чеков и счётов
  • Финансовых отчётов
  • Генерации суммы прописью в печатных формах

✨ Особенности

  • ✅ Поддержка чисел до триллионов
  • 🇷🇺 Правильное склонение: рубль, рубля, рублей
  • 🔤 Женский род для тысяч: одна тысяча, двадцать одна тысяча
  • 🧪 100% покрытие тестами
  • 🧩 Легко расширить для других языков
  • 📦 Готова к использованию как NuGet-пакет

🚀 Примеры использования

open MoneyToWords
open MoneyToWords.Presentation

match Money.TryCreate(1L, 0) with
| Ok money -> printfn "%s" (MoneyToWords.toWords money)
| Error err -> printfn "Ошибка: %s" err.Description

match Money.TryCreate(112_234L, 75) with
| Ok money -> printfn "%s" (MoneyToWords.toWords money) // → "сто двенадцать тысяч двести тридцать четыре рубля и семьдесят пять копеек"
| Error _ -> ()

📦 Использование

	open MoneyToWords

	let result = toWords 42_000L 50L
	match result with
	| Ok text -> printfn "Сумма: %s" text
	| Error msg -> printfn "Ошибка: %s" msg

🧩 Как это работает

Число разбивается на группы по 3 цифры (тысячи, миллионы и т.д.), каждая обрабатывается отдельно:

123 456 789
  |   |   └─ 789 → "семьсот восемьдесят девять"
  |   └───── 456 → "четыреста пятьдесят шесть тысяч"
  └───────── 123 → "сто двадцать три миллиона"

Для каждой группы:

  • Используются правильные формы: тысяча, тысячи, тысяч
  • Учитываются особые случаи: одна тысяча, две тысячи
  • Правильное склонение чисел: пятнадцать, а не пятьнадцать

🧪 Тестирование

Проект полностью покрыт тестами:

Юнит-тесты — все граничные случаи:

  • 0, 1, 2, 5

  • 11–19

  • 21, 22, 25 — правильное окончание

  • 100, 1000, 999_999_999_999_999

  • Свойства (FsCheck) — проверка на тысячах случайных значений:

  • Склонение по последней цифре

  • Исключения для 11–14

  • Поддержка больших чисел

Все тесты проходят на CI при каждом коммите.

🛠 Установка

	dotnet add package MoneyToWordsFSharpLib

🧱 Сборка и тесты

	dotnet build
	dotnet test

Проект использует:

  • F# .NET 10 LTS
  • xUnit, FsCheck, Unquote

📄 Лицензия

MIT — свободно используй в любых проектах, коммерческих и открытых.


🙏 Поддержка


🙌 Автор

@DivinMA — GitHub | Telegram


🟢 Статус

✅ Стабильная версия: v1.1.0 ✅ CI/CD: Build Release ✅ NuGet: NuGet


💡 Благодарности

Спасибо, что используешь этот проект!

Если он помог — поставь ⭐ — это вдохновляет на развитие.

About

Amount in words

Resources

License

Code of conduct

Contributing

Security policy

Stars

1 star

Watchers

0 watching

Forks

Packages

 
 
 

Contributors