Flutter Number Editing Controller
TextEditingController для форматирования чисел, дробных значений и валют при вводе — с поддержкой локалей.
Проблема
Встроенный TextEditingController во Flutter работает с числами как с обычным текстом. Когда пользователь вводит 1000000 в поле цены, он видит именно это — нечитаемую последовательность цифр. Нет разделителей разрядов, нет форматирования дробной части, нет символа валюты. Разработчикам приходится писать собственную логику TextInputFormatter, вручную парсить строки и бороться с ошибками позиции курсора каждый раз, когда форматирование меняет длину текста.
Типичные проблемы:
- Пользователи ошибаются при чтении больших чисел без разделителей тысяч
- Поля ввода валют игнорируют локальные правила (расположение символа, запятая вместо точки)
- Хрупкий код парсинга ломается, когда в отформатированном тексте встречаются нецифровые символы
- Курсор прыгает в неожиданные позиции после каждого нажатия клавиши
Как number_editing_controller решает эту задачу
number_editing_controller — это готовая замена TextEditingController. Назначьте его любому TextField, и он автоматически позаботится о форматировании, парсинге и управлении курсором.
Пользователь видит корректно отформатированный текст — $1,234.56 или 1.234,56 € — а ваш код получает чистое числовое значение через controller.number.

Возможности
- Форматирование целых чисел — группировка разрядов с учётом локали (
1,000,000в английской,1.000.000в немецкой) - Форматирование дробных чисел — настраиваемое минимальное и максимальное количество знаков после запятой
- Форматирование валют — символ валюты размещается до или после числа по правилам локали
- Поддержка локалей — используются ICU-шаблоны форматирования, поэтому
1234.56в USD отображается как$1,234.56в английской и1.234,56 $в немецкой локали - Отрицательные числа — флаг
allowNegativeдля ограничения ввода только положительными значениями - Изменение параметров на лету — смена локали, валюты или точности без пересоздания контроллера
- Внешний символ валюты — отображение символа как декоратора
TextField(prefix/suffix) вместо встроенного текста
Сценарии использования
Оформление заказа в e-commerce
Платёжная форма принимает суммы в разных валютах. С number_editing_controller достаточно одного контроллера — при выборе другой валюты меняется только currencyName. Поле мгновенно переформатируется без перестроения виджета.
Мультиязычные финансовые приложения
Банковское приложение для пользователей из США, Германии и Японии должно учитывать правила каждой локали: $1,234.56 vs 1.234,56 € vs ¥1,500. Контроллер обрабатывает всё это через один параметр locale.

Складской и инвентарный учёт
Складские приложения работают с большими целочисленными количествами. Контроллер целых чисел превращает 1000000 в 1,000,000, что помогает быстро заметить ошибки при вводе данных.
Аналитические дашборды
Контроллеры дробных чисел с настраиваемой точностью позволяют форматировать метрики — проценты с 2 знаками, научные измерения с 4 — сохраняя при этом сырое значение num для вычислений.
Примеры форматирования по локалям
| Локаль | Тип | Значение | Отображение |
|---|---|---|---|
en | Валюта (USD) | 1234.56 | $1,234.56 |
de | Валюта (EUR) | 1234.56 | 1.234,56 € |
fr | Валюта (EUR) | 1234.56 | 1 234,56 € |
ja | Валюта (JPY) | 1500 | ¥1,500 |
ru | Валюта (RUB) | 500 | 500 ₽ |
en | Целое число | 1234567 | 1,234,567 |
de | Дробное (макс. 2) | 1234.89 | 1.234,89 |
Начало работы
Установите пакет:
flutter pub add number_editing_controller
Требуется Flutter 3.19+ и Dart 3.3+.
Создайте контроллер и назначьте его TextField:
final controller = NumberEditingTextController.currency(
currencyName: 'USD',
locale: 'en',
);
TextField(
controller: controller,
keyboardType: TextInputType.numberWithOptions(decimal: true, signed: true),
)
// Получить числовое значение в любой момент
final amount = controller.number; // например, 1234.56
Доступны три типа контроллеров: .integer(), .decimal() и .currency(). Все параметры — локаль, разделители, валюта, точность — можно менять в рантайме без пересоздания контроллера.
Полный рабочий пример с выбором валюты, переключателем локали и внешним размещением символа валюты доступен в директории example.
Да, но в JavaScript все числа представлены как 64-битные числа с плавающей точкой, поэтому целые числа больше 2^53 - 1 (около 9 квадриллионов) теряют точность без предупреждения. На нативных платформах 64-битные целые поддерживаются полностью.
Топ контрибьюторов
thenixan
maurovanetti
Информация о репозитории
- Стек технологий
- Flutter
- Версия
- v2.1.0
- Лицензия
- BSD-3-Clause
- Контрибьюторы
- 2
- Последнее изменение
- 17 мар. 2026 г.