Реализация конвертера валют в мобильном приложении
Конвертер валют выглядит простой фичей ровно до момента, когда нужно обеспечить актуальность курсов, корректно обрабатывать округление и не уронить интерфейс при вводе дробных значений на разных локалях.
Источники курсов валют
Выбор API зависит от требований к частоте обновления и набору валют:
| API | Бесплатный план | Обновление | Особенности |
|---|---|---|---|
| ExchangeRate-API | 1500 запросов/мес | Ежедневно | Простой REST, 170+ валют |
| Open Exchange Rates | 1000 запросов/мес | Ежечасно | Исторические данные |
| Fixer.io | 100 запросов/мес | Ежечасно | EUR как базовая валюта |
| ЦБ РФ XML | Бесплатно | Ежедневно | Официальные курсы для RUB |
| НБ РБ | Бесплатно | Ежедневно | Официальные курсы для BYN |
Для большинства приложений достаточно ежедневного обновления — ЦБ РФ отдаёт XML по адресу https://www.cbr.ru/scripts/XML_daily.asp, парсим через XMLParser на iOS или XmlPullParser на Android.
Ключевые детали реализации
Кэширование. Курсы сохраняем локально: Core Data / Room для возможности работы офлайн с последними известными значениями. Показываем метку времени последнего обновления — пользователь должен понимать, насколько актуальны данные.
Арифметика. Никогда не используем Float или Double для финансовых расчётов. На iOS — NSDecimalNumber или Decimal, на Android — BigDecimal. Разница в копейках при конвертации крупных сумм будет заметна.
Ввод числа. Пользователь вводит «1.5» или «1,5» в зависимости от локали устройства. NumberFormatter на iOS и NumberFormat на Android умеют это обрабатывать, но нужно явно задавать locale и maximumFractionDigits. Без этого на немецкой локали запятая воспринимается как разделитель тысяч.
Обновление в реальном времени. При вводе суммы пересчёт должен происходить на каждое изменение символа — throttle через debounce(300ms) чтобы не спамить API при быстром вводе.
Срок реализации: 3-5 дней включая интеграцию с API, кэширование и UI.







