[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"technologies":3,"\u002Fopen-source\u002Fflutter-number-editing-controller":167},[4,10,15,21,26,32,38,43,48,53,58,63,68,73,77,82,87,92,97,103,108,113,118,123,128,133,138,143,147,152,157,162],{"title":5,"description":6,"slug":7,"category":8,"icon":9},"Android","Каждое наше приложение выходит и на Android — платформенные API, фоновое выполнение, разрешения и требования магазина вместе с ними.","android","framework","logos:android-icon",{"title":11,"description":12,"slug":13,"category":8,"icon":14},"Angular","Фронтенд-фреймворк, в котором мы работаем, когда продукт уже на Angular, — строгая структура, подходящая большим долгоживущим приложениям.","angular","logos:angular-icon",{"title":16,"description":17,"slug":18,"category":19,"icon":20},"Dart","Язык, на котором написано каждое наше Flutter-приложение, — строгая null safety, полноценный pattern matching и компиляция в нативный код и веб.","dart","language","logos:dart",{"title":22,"description":23,"slug":24,"category":8,"icon":25},"Django","Python-фреймворк, который мы берём, когда продукту нужны админка, аутентификация и модель данных в первый же день, а не самописный сервис.","django","logos:django-icon",{"title":27,"description":28,"slug":29,"category":30,"icon":31},"Docker","Каждый наш сервис поставляется в виде контейнера, поэтому на ноутбуке, в CI и в продакшене работает один и тот же артефакт, а не три разных.","docker","infrastructure","logos:docker-icon",{"title":33,"description":34,"slug":35,"category":36,"icon":37},"Fastlane","Автоматизация релизов в нашей мобильной разработке — подпись, сборки и загрузка в сторы идут из CI, а не с ноутбука одного инженера в день релиза.","fastlane","tools","logos:fastlane",{"title":39,"description":40,"slug":41,"category":8,"icon":42},"Flutter","Наш основной мобильный стек с 2018 года — одна кодовая база на Dart для iOS, Android, веба и десктопа без отдельной команды под каждую платформу.","flutter","logos:flutter",{"title":44,"description":45,"slug":46,"category":36,"icon":47},"Git","Все проекты, к которым мы прикасаемся, живут в Git — ревью пул-реквестов, CI на каждой ветке и история, понятная и спустя месяцы.","git","logos:git-icon",{"title":49,"description":50,"slug":51,"category":19,"icon":52},"Go","Наш бэкенд-язык для real-time API и сервисов под нагрузкой — маленькие бинарники, быстрая сборка и конкурентность, которая остаётся читаемой.","go","logos:gopher",{"title":54,"description":55,"slug":56,"category":30,"icon":57},"Google Cloud","Облако, в котором работают наши продакшен-нагрузки, — управляемый Kubernetes, хранилище и сеть без серверов, которые надо обслуживать руками.","gcp","logos:google-cloud",{"title":59,"description":60,"slug":61,"category":36,"icon":62},"Gradle","Система сборки, через которую проходит каждый Android-релиз, — флейворы, конфигурации подписи и вся обвязка зависимостей под Flutter-приложением.","gradle","logos:gradle",{"title":64,"description":65,"slug":66,"category":30,"icon":67},"Helm","Так мы упаковываем деплой в Kubernetes — сервис, конфигурация, секреты и ingress как одна версионируемая единица, которую можно выкатить и откатить.","helm","logos:helm",{"title":69,"description":70,"slug":71,"category":19,"icon":72},"Kotlin","То, что мы берём, когда Flutter-приложению нужен настоящий Android под ним, — platform channels, фоновые задачи и интеграции с нативными SDK.","kotlin","logos:kotlin-icon",{"title":74,"description":75,"slug":76,"category":8,"icon":72},"Kotlin Multiplatform","Общая бизнес-логика для iOS и Android, а нативный интерфейс у каждой платформы свой, — альтернатива, когда Flutter не подходит.","kmp",{"title":78,"description":79,"slug":80,"category":30,"icon":81},"Kubernetes","Так мы запускаем сервисы в продакшене — деплой в Helm-чартах, откатываемые выкатки и масштабирование, для которого не нужен человек в три ночи.","kubernetes","logos:kubernetes",{"title":83,"description":84,"slug":85,"category":30,"icon":86},"NATS","Лёгкий обмен сообщениями между сервисами — publish\u002Fsubscribe и request\u002Freply без эксплуатационного веса полноценного кластера брокера.","nats","logos:nats-icon",{"title":88,"description":89,"slug":90,"category":8,"icon":91},"Nuxt","Vue с серверным рендерингом, роутингом и SEO из коробки — так мы делаем сайты и веб-приложения, которые должны быстро грузиться и индексироваться.","nuxt","logos:nuxt-icon",{"title":93,"description":94,"slug":95,"category":19,"icon":96},"PHP","Там, где PHP-бэкенд уже есть: дорабатываем его, интегрируемся с ним и делаем мобильные и веб-клиенты, которые он обслуживает.","php","logos:php",{"title":98,"description":99,"slug":100,"category":101,"icon":102},"PostgreSQL","Наша база данных по умолчанию — от проектирования схемы до настройки индексов мы берём её, если у продукта нет конкретной причины взять другую.","postgres","database","logos:postgresql",{"title":104,"description":105,"slug":106,"category":19,"icon":107},"Python","Наш язык для бэкендов, работы с данными и AI-интеграций — включая Python-биндинги, которые мы выпускаем к собственным инструментам на Rust.","python","logos:python",{"title":109,"description":110,"slug":111,"category":8,"icon":112},"React","Фронтенд-библиотека, в которой мы работаем, когда продукт уже на React, — компоненты, хуки и выросшая вокруг них экосистема.","react","logos:react",{"title":114,"description":115,"slug":116,"category":101,"icon":117},"Redis","Место для данных, которые должны быть быстрыми и которые не жалко пересчитать, — кэши, сессии, лимиты и очереди фоновых задач.","redis","logos:redis",{"title":119,"description":120,"slug":121,"category":19,"icon":122},"Ruby","Язык, на котором написана автоматизация наших мобильных релизов, — лейны Fastlane, кастомные действия и связка с CI, доставляющая сборки в сторы.","ruby","logos:ruby",{"title":124,"description":125,"slug":126,"category":19,"icon":127},"Rust","Куда мы идём, когда важны и скорость, и корректность, — рендеринг документов, CLI-инструменты и сервисы, которые обязаны оставаться быстрыми и предсказуемыми.","rust","simple-icons:rust",{"title":129,"description":130,"slug":131,"category":101,"icon":132},"SQLite","База данных, которая поставляется внутри приложения, — локальные кэши, offline-first хранилище и всё, что должно работать без сети.","sqlite","logos:sqlite",{"title":134,"description":135,"slug":136,"category":8,"icon":137},"Strapi","Headless CMS, к которой мы обращаемся, когда контент должны вести сами редакторы, — готовая админка и чистый API вместо самописных.","strapi","logos:strapi-icon",{"title":139,"description":140,"slug":141,"category":19,"icon":142},"Swift","То, что мы берём, когда Flutter-приложению нужен настоящий iOS под ним, — platform channels, интеграции нативных SDK, виджеты и App Clips.","swift","logos:swift",{"title":144,"description":145,"slug":146,"category":8,"icon":142},"SwiftUI","UI-фреймворк Apple, на котором мы делаем нативные поверхности, недоступные Flutter-приложению, — виджеты, App Clips и расширения.","swiftui",{"title":148,"description":149,"slug":150,"category":8,"icon":151},"Tailwind CSS","Так мы стилизуем весь фронтенд — утилитарные классы и дизайн-токены вместо таблицы стилей, которая только растёт и никогда не чистится.","tailwind","logos:tailwindcss-icon",{"title":153,"description":154,"slug":155,"category":19,"icon":156},"TypeScript","Стандарт для всего, что мы пишем для браузера и для Node-сервисов, — типы ловят ошибки интеграции раньше, чем код доходит до ревью.","typescript","logos:typescript-icon",{"title":158,"description":159,"slug":160,"category":8,"icon":161},"Vue","Наш фронтенд-фреймворк для админок, дашбордов мерчантов и веб-приложений, которые должны оставаться поддерживаемыми годами, а не спринтами.","vue","logos:vue",{"title":163,"description":164,"slug":165,"category":36,"icon":166},"Whisper","Открытая модель распознавания речи от OpenAI — движок транскрипции для голосового ввода, который работает и как бэкенд-сервис, и прямо на устройстве в приложении.","whisper","simple-icons:openai",{"id":168,"title":169,"body":170,"description":824,"extension":825,"links":826,"meta":830,"metaDescription":831,"metaTitle":831,"navigation":676,"ogDescription":832,"path":833,"repository":834,"seo":838,"slug":839,"stem":840,"technologies":841,"updated":842,"__hash__":843,"stats":844},"open_source_ru\u002Fopen-source\u002Fflutter-number-editing-controller.md","Flutter Number Editing Controller",{"type":171,"value":172,"toc":811},"minimark",[173,178,195,198,214,218,231,246,254,258,329,333,338,348,352,367,373,377,386,390,397,401,558,562,565,592,595,601,778,793,803,807],[174,175,177],"h2",{"id":176},"проблема","Проблема",[179,180,181,182,186,187,190,191,194],"p",{},"Встроенный ",[183,184,185],"code",{},"TextEditingController"," во Flutter работает с числами как с обычным текстом. Когда пользователь вводит ",[183,188,189],{},"1000000"," в поле цены, он видит именно это — нечитаемую последовательность цифр. Нет разделителей разрядов, нет форматирования дробной части, нет символа валюты. Разработчикам приходится писать собственную логику ",[183,192,193],{},"TextInputFormatter",", вручную парсить строки и бороться с ошибками позиции курсора каждый раз, когда форматирование меняет длину текста.",[179,196,197],{},"Типичные проблемы:",[199,200,201,205,208,211],"ul",{},[202,203,204],"li",{},"Пользователи ошибаются при чтении больших чисел без разделителей тысяч",[202,206,207],{},"Поля ввода валют игнорируют локальные правила (расположение символа, запятая вместо точки)",[202,209,210],{},"Хрупкий код парсинга ломается, когда в отформатированном тексте встречаются нецифровые символы",[202,212,213],{},"Курсор прыгает в неожиданные позиции после каждого нажатия клавиши",[174,215,217],{"id":216},"как-number_editing_controller-решает-эту-задачу","Как number_editing_controller решает эту задачу",[179,219,220,223,224,226,227,230],{},[183,221,222],{},"number_editing_controller"," — это готовая замена ",[183,225,185],{},". Назначьте его любому ",[183,228,229],{},"TextField",", и он автоматически позаботится о форматировании, парсинге и управлении курсором.",[179,232,233,234,237,238,241,242,245],{},"Пользователь видит корректно отформатированный текст — ",[183,235,236],{},"$1,234.56"," или ",[183,239,240],{},"1.234,56 €"," — а ваш код получает чистое числовое значение через ",[183,243,244],{},"controller.number",".",[179,247,248],{},[249,250],"img",{"alt":251,"src":252,"style":253},"Демо форматирования валюты","\u002Fopen-source\u002Fnumber-editing-controller\u002Fcurrency.gif","max-height: 600px; height: auto; width: auto;",[174,255,257],{"id":256},"возможности","Возможности",[199,259,260,275,281,287,304,314,320],{},[202,261,262,266,267,270,271,274],{},[263,264,265],"strong",{},"Форматирование целых чисел"," — группировка разрядов с учётом локали (",[183,268,269],{},"1,000,000"," в английской, ",[183,272,273],{},"1.000.000"," в немецкой)",[202,276,277,280],{},[263,278,279],{},"Форматирование дробных чисел"," — настраиваемое минимальное и максимальное количество знаков после запятой",[202,282,283,286],{},[263,284,285],{},"Форматирование валют"," — символ валюты размещается до или после числа по правилам локали",[202,288,289,292,293,296,297,299,300,303],{},[263,290,291],{},"Поддержка локалей"," — используются ICU-шаблоны форматирования, поэтому ",[183,294,295],{},"1234.56"," в USD отображается как ",[183,298,236],{}," в английской и ",[183,301,302],{},"1.234,56 $"," в немецкой локали",[202,305,306,309,310,313],{},[263,307,308],{},"Отрицательные числа"," — необязательный флаг ",[183,311,312],{},"allowNegative"," ограничивает ввод только положительными значениями",[202,315,316,319],{},[263,317,318],{},"Изменение параметров на лету"," — смена локали, валюты или точности без пересоздания контроллера",[202,321,322,325,326,328],{},[263,323,324],{},"Внешний символ валюты"," — отображение символа как декоратора ",[183,327,229],{}," (prefix\u002Fsuffix) вместо встроенного текста",[174,330,332],{"id":331},"сценарии-использования","Сценарии использования",[334,335,337],"h3",{"id":336},"оформление-заказа-в-e-commerce","Оформление заказа в e-commerce",[179,339,340,341,343,344,347],{},"Платёжная форма принимает суммы в разных валютах. С ",[183,342,222],{}," достаточно одного контроллера — при выборе другой валюты меняется только ",[183,345,346],{},"currencyName",". Поле мгновенно переформатируется без перестроения виджета.",[334,349,351],{"id":350},"мультиязычные-финансовые-приложения","Мультиязычные финансовые приложения",[179,353,354,355,357,358,357,360,363,364,245],{},"Банковское приложение для пользователей из США, Германии и Японии должно учитывать правила каждой локали: ",[183,356,236],{}," vs ",[183,359,240],{},[183,361,362],{},"¥1,500",". Контроллер обрабатывает всё это через один параметр ",[183,365,366],{},"locale",[179,368,369],{},[249,370],{"alt":371,"src":372,"style":253},"Демо форматирования целых чисел","\u002Fopen-source\u002Fnumber-editing-controller\u002Finteger.gif",[334,374,376],{"id":375},"складской-учёт-и-поля-количества","Складской учёт и поля количества",[179,378,379,380,382,383,385],{},"Складские приложения работают с большими целочисленными количествами. Контроллер целых чисел превращает ",[183,381,189],{}," в ",[183,384,269],{},", что помогает быстро заметить ошибки при вводе данных.",[334,387,389],{"id":388},"аналитические-дашборды","Аналитические дашборды",[179,391,392,393,396],{},"Контроллеры дробных чисел с настраиваемой точностью позволяют форматировать метрики — проценты с 2 знаками, научные измерения с 4 — сохраняя при этом сырое значение ",[183,394,395],{},"num"," для вычислений.",[174,398,400],{"id":399},"примеры-форматирования-по-локалям","Примеры форматирования по локалям",[402,403,404,423],"table",{},[405,406,407],"thead",{},[408,409,410,414,417,420],"tr",{},[411,412,413],"th",{},"Локаль",[411,415,416],{},"Тип",[411,418,419],{},"Значение",[411,421,422],{},"Отображение",[424,425,426,445,463,481,500,520,539],"tbody",{},[408,427,428,434,437,441],{},[429,430,431],"td",{},[183,432,433],{},"en",[429,435,436],{},"Валюта (USD)",[429,438,439],{},[183,440,295],{},[429,442,443],{},[183,444,236],{},[408,446,447,452,455,459],{},[429,448,449],{},[183,450,451],{},"de",[429,453,454],{},"Валюта (EUR)",[429,456,457],{},[183,458,295],{},[429,460,461],{},[183,462,240],{},[408,464,465,470,472,476],{},[429,466,467],{},[183,468,469],{},"fr",[429,471,454],{},[429,473,474],{},[183,475,295],{},[429,477,478],{},[183,479,480],{},"1 234,56 €",[408,482,483,488,491,496],{},[429,484,485],{},[183,486,487],{},"ja",[429,489,490],{},"Валюта (JPY)",[429,492,493],{},[183,494,495],{},"1500",[429,497,498],{},[183,499,362],{},[408,501,502,507,510,515],{},[429,503,504],{},[183,505,506],{},"ru",[429,508,509],{},"Валюта (RUB)",[429,511,512],{},[183,513,514],{},"500",[429,516,517],{},[183,518,519],{},"500 ₽",[408,521,522,526,529,534],{},[429,523,524],{},[183,525,433],{},[429,527,528],{},"Целое число",[429,530,531],{},[183,532,533],{},"1234567",[429,535,536],{},[183,537,538],{},"1,234,567",[408,540,541,545,548,553],{},[429,542,543],{},[183,544,451],{},[429,546,547],{},"Дробное (макс. 2)",[429,549,550],{},[183,551,552],{},"1234.89",[429,554,555],{},[183,556,557],{},"1.234,89",[174,559,561],{"id":560},"начало-работы","Начало работы",[179,563,564],{},"Установите пакет:",[566,567,572],"pre",{"className":568,"code":569,"language":570,"meta":571,"style":571},"language-shell shiki shiki-themes material-theme-lighter github-light github-dark","flutter pub add number_editing_controller\n","shell","",[183,573,574],{"__ignoreMap":571},[575,576,579,582,586,589],"span",{"class":577,"line":578},"line",1,[575,580,41],{"class":581},"sbgvK",[575,583,585],{"class":584},"s_sjI"," pub",[575,587,588],{"class":584}," add",[575,590,591],{"class":584}," number_editing_controller\n",[179,593,594],{},"Требуется Flutter 3.19+ и Dart 3.3+.",[179,596,597,598,600],{},"Создайте контроллер и назначьте его ",[183,599,229],{},":",[566,602,605],{"className":603,"code":604,"language":18,"meta":571,"style":571},"language-dart shiki shiki-themes material-theme-lighter github-light github-dark","final controller = NumberEditingTextController.currency(\n  currencyName: 'USD',\n  locale: 'en',\n);\n\nTextField(\n  controller: controller,\n  keyboardType: TextInputType.numberWithOptions(decimal: true, signed: true),\n)\n\n\u002F\u002F Получить числовое значение в любой момент\nfinal amount = controller.number; \u002F\u002F например, 1234.56\n",[183,606,607,635,649,662,671,678,685,698,737,743,748,755],{"__ignoreMap":571},[575,608,609,613,617,621,625,628,632],{"class":577,"line":578},[575,610,612],{"class":611},"sbsja","final",[575,614,616],{"class":615},"su5hD"," controller ",[575,618,620],{"class":619},"smGrS","=",[575,622,624],{"class":623},"sZMiF"," NumberEditingTextController",[575,626,245],{"class":627},"sP7_E",[575,629,631],{"class":630},"sGLFI","currency",[575,633,634],{"class":615},"(\n",[575,636,638,641,643,646],{"class":577,"line":637},2,[575,639,640],{"class":615},"  currencyName",[575,642,600],{"class":619},[575,644,645],{"class":584}," 'USD'",[575,647,648],{"class":627},",\n",[575,650,652,655,657,660],{"class":577,"line":651},3,[575,653,654],{"class":615},"  locale",[575,656,600],{"class":619},[575,658,659],{"class":584}," 'en'",[575,661,648],{"class":627},[575,663,665,668],{"class":577,"line":664},4,[575,666,667],{"class":615},")",[575,669,670],{"class":627},";\n",[575,672,674],{"class":577,"line":673},5,[575,675,677],{"emptyLinePlaceholder":676},true,"\n",[575,679,681,683],{"class":577,"line":680},6,[575,682,229],{"class":623},[575,684,634],{"class":615},[575,686,688,691,693,696],{"class":577,"line":687},7,[575,689,690],{"class":615},"  controller",[575,692,600],{"class":619},[575,694,695],{"class":615}," controller",[575,697,648],{"class":627},[575,699,701,704,706,709,711,714,717,719,723,726,729,731,733,735],{"class":577,"line":700},8,[575,702,703],{"class":615},"  keyboardType",[575,705,600],{"class":619},[575,707,708],{"class":623}," TextInputType",[575,710,245],{"class":627},[575,712,713],{"class":630},"numberWithOptions",[575,715,716],{"class":615},"(decimal",[575,718,600],{"class":619},[575,720,722],{"class":721},"s39Yj"," true",[575,724,725],{"class":627},",",[575,727,728],{"class":615}," signed",[575,730,600],{"class":619},[575,732,722],{"class":721},[575,734,667],{"class":615},[575,736,648],{"class":627},[575,738,740],{"class":577,"line":739},9,[575,741,742],{"class":615},")\n",[575,744,746],{"class":577,"line":745},10,[575,747,677],{"emptyLinePlaceholder":676},[575,749,751],{"class":577,"line":750},11,[575,752,754],{"class":753},"sutJx","\u002F\u002F Получить числовое значение в любой момент\n",[575,756,758,760,763,765,767,769,772,775],{"class":577,"line":757},12,[575,759,612],{"class":611},[575,761,762],{"class":615}," amount ",[575,764,620],{"class":619},[575,766,695],{"class":615},[575,768,245],{"class":627},[575,770,771],{"class":615},"number",[575,773,774],{"class":627},";",[575,776,777],{"class":753}," \u002F\u002F например, 1234.56\n",[179,779,780,781,784,785,788,789,792],{},"Доступны три типа контроллеров: ",[183,782,783],{},".integer()",", ",[183,786,787],{},".decimal()"," и ",[183,790,791],{},".currency()",". Все параметры — локаль, разделители, валюта, точность — можно менять в рантайме без пересоздания контроллера.",[179,794,795,796,245],{},"Полный рабочий пример с выбором валюты, переключателем локали и внешним размещением символа валюты доступен в ",[797,798,802],"a",{"href":799,"rel":800},"https:\u002F\u002Fgithub.com\u002Fnerdy-pro\u002Fflutter_number_editing_controller\u002Ftree\u002Fmain\u002Fexample",[801],"nofollow","директории example",[804,805],"questions",{":items":806},"[{\"title\":\"Работает ли это с Flutter web?\",\"text\":\"Да, но в JavaScript все числа представлены как 64-битные числа с плавающей точкой, поэтому целые числа больше 2^53 - 1 (около 9 квадриллионов) теряют точность без предупреждения. На нативных платформах 64-битные целые поддерживаются полностью.\"},{\"title\":\"Можно ли менять валюту или локаль после создания контроллера?\",\"text\":\"Да. Все параметры форматирования изменяемы в рантайме. Смена локали, кода валюты, разделителей или точности немедленно переформатирует отображаемый текст без пересоздания контроллера.\"},{\"title\":\"Поддерживается ли индийская система нумерации (лакх\u002Fкрор)?\",\"text\":\"Пока нет. Библиотека использует одинаковый размер группы, определяемый ICU-шаблоном локали (обычно группы по 3 цифры). Системы нумерации с переменной шириной группы, такие как индийская, не поддерживаются.\"},{\"title\":\"Как отобразить символ валюты вне текстового поля?\",\"text\":\"Установите showCurrencySymbol в false и используйте свойства resolvedCurrencySymbol и currencySymbolPosition для размещения символа как prefix или suffix декоратора TextField.\"},{\"title\":\"Что происходит с очень длинными числами?\",\"text\":\"Точность дробной части ограничена 20 знаками (лимит Dart toStringAsFixed). Крайне длинный ввод может замедлить форматирование, но типичные финансовые и бизнес-значения обрабатываются без проблем.\"}]",[808,809,810],"style",{},"html pre.shiki code .sbgvK, html code.shiki .sbgvK{--shiki-light:#E2931D;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .s_sjI, html code.shiki .s_sjI{--shiki-light:#91B859;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sbsja, html code.shiki .sbsja{--shiki-light:#9C3EDA;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .su5hD, html code.shiki .su5hD{--shiki-light:#90A4AE;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .smGrS, html code.shiki .smGrS{--shiki-light:#39ADB5;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sZMiF, html code.shiki .sZMiF{--shiki-light:#E2931D;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sP7_E, html code.shiki .sP7_E{--shiki-light:#39ADB5;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sGLFI, html code.shiki .sGLFI{--shiki-light:#6182B8;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .s39Yj, html code.shiki .s39Yj{--shiki-light:#39ADB5;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sutJx, html code.shiki .sutJx{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#6A737D;--shiki-default-font-style:inherit;--shiki-dark:#6A737D;--shiki-dark-font-style:inherit}",{"title":571,"searchDepth":637,"depth":637,"links":812},[813,814,815,816,822,823],{"id":176,"depth":637,"text":177},{"id":216,"depth":637,"text":217},{"id":256,"depth":637,"text":257},{"id":331,"depth":637,"text":332,"children":817},[818,819,820,821],{"id":336,"depth":651,"text":337},{"id":350,"depth":651,"text":351},{"id":375,"depth":651,"text":376},{"id":388,"depth":651,"text":389},{"id":399,"depth":637,"text":400},{"id":560,"depth":637,"text":561},"TextEditingController для форматирования чисел, дробных значений и валют при вводе — с поддержкой локалей.","md",[827],{"type":828,"url":829},"pub_dev","https:\u002F\u002Fpub.dev\u002Fpackages\u002Fnumber_editing_controller",{},null,"TextEditingController, который форматирует числа, дробные значения и валюты прямо во время ввода — в той локали, в которой находится пользователь.","\u002Fopen-source\u002Fflutter-number-editing-controller",{"type":835,"company":836,"name":837},"github","nerdy-pro","flutter_number_editing_controller",{"title":169,"description":824},"flutter-number-editing-controller","open-source\u002Fflutter-number-editing-controller",[41,18],"2026-03-17","Fflwkai5fk1Ku3Wt966AkeMSW9Z9o5Wi6ZhInaxngpM",{"forks":673,"stars":651,"contributors":845,"last_release":855,"issues":856,"has_contribution_guide":857,"license":858,"last_updated":859,"watchers":651},[846,851],{"login":847,"profile_url":848,"avatar_url":849,"contributions":850},"thenixan","https:\u002F\u002Fgithub.com\u002Fthenixan","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F3602098?v=4",94,{"login":852,"profile_url":853,"avatar_url":854,"contributions":578},"maurovanetti","https:\u002F\u002Fgithub.com\u002Fmaurovanetti","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F402070?v=4","v2.1.0",0,false,"BSD-3-Clause","2026-03-17T10:44:29Z"]