Настройка форматирования дат и чисел под локаль в мобильном приложении

TRUETECH занимается разработкой, поддержкой и обслуживанием мобильных приложений iOS, Android, PWA. Имеем большой опыт и экспертизу для публикации мобильных приложений в популярные маркеты Google Play, App Store, Amazon, AppGallery и другие.
Разработка и поддержка любых видов мобильных приложений:
Информационные и развлекательные мобильные приложения
Новостные приложения, игры, справочники, онлайн-каталоги, погодные, фитнес и здоровье, туристические, образовательные, социальные сети и мессенджеры, квиз, блоги и подкасты, форумы, агрегаторы
Мобильные приложения электронной коммерции
Интернет-магазины, B2B-приложения, маркетплейсы, онлайн-обменники, кэшбэк-сервисы, биржи, дропшиппинг-платформы, программы лояльности, доставка еды и товаров, платежные системы
Мобильные приложения для управления бизнес-процессами
CRM-системы, ERP-системы, управление проектами, инструменты для команды продаж, учет финансов, управление производством, логистика и доставка, управление персоналом, системы мониторинга данных
Мобильные приложения электронных услуг
Доски объявлений, онлайн-школы, онлайн-кинотеатры, платформы предоставления электронных услуг, платформы кешбека, видеохостинги, тематические порталы, платформы онлайн-бронирования и записи, платформы онлайн-торговли

Это лишь некоторые из типы мобильных приложений, с которыми мы работаем, и каждый из них может иметь свои специфические особенности и функциональность, а также быть адаптированным под конкретные потребности и цели клиента.

Предлагаемые услуги
Показано 1 из 1 услугВсе 1735 услуг
Настройка форматирования дат и чисел под локаль в мобильном приложении
Простая
~1 рабочий день
Часто задаваемые вопросы
Наши компетенции:
Этапы разработки
Последние работы
  • image_mobile-applications_feedme_467_0.webp
    Разработка мобильного приложения для компании FEEDME
    756
  • image_mobile-applications_xoomer_471_0.webp
    Разработка мобильного приложения для компании XOOMER
    624
  • image_mobile-applications_rhl_428_0.webp
    Разработка мобильного приложения для компании RHL
    1054
  • image_mobile-applications_zippy_411_0.webp
    Разработка мобильного приложения для компании ZIPPY
    947
  • image_mobile-applications_affhome_429_0.webp
    Разработка мобильного приложения для компании Affhome
    862
  • image_mobile-applications_flavors_409_0.webp
    Разработка мобильного приложения для компании FLAVORS
    445

Настройка форматирования дат и чисел под локаль в мобильном приложении

Приложение показывает «1,234.56» пользователю из Германии, у которого это выглядит как «одна тысяча двести тридцать четыре целых пятьдесят шесть». Или дату «04/05/2024» — апрель пятое или четвёртое мая? Зависит от локали пользователя, и это не просто косметика: в финансовых и медицинских приложениях неправильное форматирование — баг с реальными последствиями.

Где конкретно ломается

Android. String.format("%.2f", price) — использует Locale.getDefault() системы, но только если не передать локаль явно. На некоторых версиях MIUI Locale.getDefault() возвращает Locale.US независимо от настроек пользователя. Правильно: String.format(Locale.getDefault(Locale.Category.FORMAT), "%.2f", price). Или NumberFormat.getInstance(locale).format(price).

SimpleDateFormat — потокоопасен и устарел. DateTimeFormatter (java.time, API 26+) или ThreeTenABP для старых версий. Паттерн "dd/MM/yyyy" — хардкод, не учитывает локаль. DateTimeFormatter.ofLocalizedDate(FormatStyle.SHORT).withLocale(locale) — правильный путь.

iOS. DateFormatter без явно заданного locale берёт Locale.current — кажется, правильно. Но если DateFormatter создаётся в фоновом потоке и кешируется, он может захватить locale до того, как пользователь сменил язык в приложении. NumberFormatter аналогично. Правило: formatter.locale = Locale(identifier: userSelectedLocale) — всегда явно.

Locale(identifier: "ru_RU") vs Locale(identifier: "ru") — разница есть: с регионом применяются региональные настройки чисел и дат (в России разделитель целой/дробной части — запятая, в Беларуси — тоже, но формат телефонов другой).

Flutter. Пакет intl: DateFormat.yMd(locale).format(date), NumberFormat.currency(locale: locale, symbol: symbol).format(amount). Важно: intl не включает locale-данные автоматически — нужен initializeDateFormatting(locale) перед первым использованием, иначе MissingLocaleDataException в рантайме.

Валюта — отдельная история

NumberFormat.getCurrencyInstance(locale).format(amount) — форматирует сумму с символом валюты по правилам локали. Но символ валюты и её позиция зависят от locale: в en_US это $1,234.56, в de_DE1.234,56 €, в ru_RU1 234,56 ₽. Если у вас мультивалютное приложение, символ нужно передавать явно через NumberFormat.getCurrencyInstance(locale).apply { currency = Currency.getInstance("EUR") }.

Отдельная боль — тысячные разделители. В hi_IN (хинди) группировка не тройками, а по схеме 2-2-3 (лакхи): 1,23,456. NumberFormat это поддерживает, но кастомная реализация через replace — нет.

Что делаем

Аудит всех мест форматирования в коде: grep -rn "SimpleDateFormat\|String.format\|\.toString()". Заменяем на locale-aware форматтеры. Добавляем утилитный слой LocaleFormatter / AppFormatter — централизованное место, где locale подставляется из текущего контекста приложения. Пишем unit-тесты с несколькими locale-фикстурами (de_DE, ar_SA, hi_IN).

Срок: 1 день для приложения без кастомных компонентов отображения. Стоимость рассчитывается индивидуально.