Flutter Number Editing Controller

TextEditingController для форматирования чисел, дробных значений и валют при вводе — с поддержкой локалей.

Flutter
3Звезды
5Форки
v2.1.0

Проблема

Встроенный 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.561.234,56 €
frВалюта (EUR)1234.561 234,56 €
jaВалюта (JPY)1500¥1,500
ruВалюта (RUB)500500 ₽
enЦелое число12345671,234,567
deДробное (макс. 2)1234.891.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

thenixan

94 commits
maurovanetti

maurovanetti

1 commits

Информация о репозитории

Стек технологий
Flutter
Версия
v2.1.0
Лицензия
BSD-3-Clause
Контрибьюторы
2
Последнее изменение
17 мар. 2026 г.

Активность

Звезды3
Форки5
Наблюдатели3

Хотите внести вклад?

Посмотреть репозиторий