[{"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","Todas las apps que entregamos llegan a Android: APIs de plataforma, ejecución en segundo plano, permisos y los requisitos de tienda que traen consigo.","android","framework","logos:android-icon",{"title":11,"description":12,"slug":13,"category":8,"icon":14},"Angular","El framework de frontend en el que trabajamos cuando un producto ya es Angular: una estructura con todo incluido que encaja en apps grandes y de vida larga.","angular","logos:angular-icon",{"title":16,"description":17,"slug":18,"category":19,"icon":20},"Dart","El lenguaje en el que está escrita cada app Flutter que entregamos: null safety robusto, pattern matching de verdad y un compilador que apunta a nativo y a la web.","dart","language","logos:dart",{"title":22,"description":23,"slug":24,"category":8,"icon":25},"Django","El framework de Python que usamos cuando un producto necesita administración, autenticación y un modelo de datos real desde el primer día.","django","logos:django-icon",{"title":27,"description":28,"slug":29,"category":30,"icon":31},"Docker","Cada servicio que construimos se publica como contenedor, así que lo que corre en un portátil, en CI y en producción es un solo artefacto y no tres.","docker","infrastructure","logos:docker-icon",{"title":33,"description":34,"slug":35,"category":36,"icon":37},"Fastlane","La automatización de releases móviles: firma, builds y subidas a las tiendas desde CI, no desde el portátil de un ingeniero el día del lanzamiento.","fastlane","tools","logos:fastlane",{"title":39,"description":40,"slug":41,"category":8,"icon":42},"Flutter","Nuestro stack móvil principal desde 2018: una base de código Dart que llega a iOS, Android, web y escritorio sin un equipo por plataforma.","flutter","logos:flutter",{"title":44,"description":45,"slug":46,"category":36,"icon":47},"Git","Todos los proyectos que tocamos viven en Git: pull requests revisadas, CI en cada rama y un historial que sigue teniendo sentido meses después.","git","logos:git-icon",{"title":49,"description":50,"slug":51,"category":19,"icon":52},"Go","Nuestro lenguaje de backend para APIs en tiempo real y servicios bajo carga: binarios pequeños, compilaciones rápidas y concurrencia que sigue siendo legible.","go","logos:gopher",{"title":54,"description":55,"slug":56,"category":30,"icon":57},"Google Cloud","La nube donde corren nuestras cargas de producción: Kubernetes gestionado, almacenamiento y red, sin servidores hechos a mano que nadie quiere mantener.","gcp","logos:google-cloud",{"title":59,"description":60,"slug":61,"category":36,"icon":62},"Gradle","El sistema de build por el que pasa cada release de Android: product flavours, configuraciones de firma y el cableado de dependencias bajo una app Flutter.","gradle","logos:gradle",{"title":64,"description":65,"slug":66,"category":30,"icon":67},"Helm","Cómo empaquetamos un despliegue de Kubernetes: servicio, configuración, secretos e ingress como una unidad versionada que se puede promover y revertir.","helm","logos:helm",{"title":69,"description":70,"slug":71,"category":19,"icon":72},"Kotlin","A lo que recurrimos cuando una app Flutter necesita Android de verdad por debajo: platform channels, trabajo en segundo plano e integraciones con SDK nativos.","kotlin","logos:kotlin-icon",{"title":74,"description":75,"slug":76,"category":8,"icon":72},"Kotlin Multiplatform","Compartir la lógica de negocio entre iOS y Android mientras cada plataforma conserva su UI nativa: la alternativa cuando Flutter no encaja.","kmp",{"title":78,"description":79,"slug":80,"category":30,"icon":81},"Kubernetes","Cómo ejecutamos servicios en producción: despliegues con Helm, rollouts reversibles y escalado que no necesita a nadie a las 3 de la mañana.","kubernetes","logos:kubernetes",{"title":83,"description":84,"slug":85,"category":30,"icon":86},"NATS","Mensajería ligera entre servicios: publicación\u002Fsuscripción y petición\u002Frespuesta sin el peso operativo de un clúster de broker completo.","nats","logos:nats-icon",{"title":88,"description":89,"slug":90,"category":8,"icon":91},"Nuxt","Vue con renderizado en servidor, enrutado y SEO resueltos: así hacemos sitios y apps web que deben ser rápidas e indexables en la primera carga.","nuxt","logos:nuxt-icon",{"title":93,"description":94,"slug":95,"category":19,"icon":96},"PHP","Donde trabajamos con un backend PHP ya existente: extenderlo, integrarse con él y construir los clientes móviles y web a los que tiene que servir.","php","logos:php",{"title":98,"description":99,"slug":100,"category":101,"icon":102},"PostgreSQL","Nuestra base de datos por defecto, salvo que un producto dé una razón concreta para no usarla: del diseño del esquema al ajuste de índices.","postgres","database","logos:postgresql",{"title":104,"description":105,"slug":106,"category":19,"icon":107},"Python","Nuestro lenguaje para backends, trabajo con datos e integraciones de IA, incluidos los bindings de Python que publicamos para nuestras propias herramientas en Rust.","python","logos:python",{"title":109,"description":110,"slug":111,"category":8,"icon":112},"React","La librería de frontend en la que trabajamos cuando un producto ya es React: componentes, hooks y el ecosistema que ha crecido a su alrededor.","react","logos:react",{"title":114,"description":115,"slug":116,"category":101,"icon":117},"Redis","Donde ponemos los datos que tienen que ser rápidos y se pueden reconstruir: cachés, sesiones, límites de tasa y las colas tras las rutas lentas de un producto.","redis","logos:redis",{"title":119,"description":120,"slug":121,"category":19,"icon":122},"Ruby","El lenguaje de nuestra automatización de releases móviles: lanes de Fastlane, acciones a medida y el pegamento de CI que sube builds a las tiendas.","ruby","logos:ruby",{"title":124,"description":125,"slug":126,"category":19,"icon":127},"Rust","A donde vamos cuando importan tanto el rendimiento como la corrección: renderizado de documentos, herramientas de CLI y servicios que tienen que ser rápidos y predecibles.","rust","simple-icons:rust",{"title":129,"description":130,"slug":131,"category":101,"icon":132},"SQLite","La base de datos que viaja dentro de la app: cachés locales, almacenamiento offline-first y todo lo que tiene que seguir funcionando sin red.","sqlite","logos:sqlite",{"title":134,"description":135,"slug":136,"category":8,"icon":137},"Strapi","Un CMS headless para cuando los editores necesitan ser dueños del contenido: una administración de verdad y una API limpia, sin construirlas desde cero.","strapi","logos:strapi-icon",{"title":139,"description":140,"slug":141,"category":19,"icon":142},"Swift","A lo que recurrimos cuando una app Flutter necesita iOS de verdad por debajo: platform channels, integraciones con SDK nativos, widgets y App Clips.","swift","logos:swift",{"title":144,"description":145,"slug":146,"category":8,"icon":142},"SwiftUI","El framework de UI de Apple, donde construimos las superficies nativas que una app Flutter no puede tener: widgets, App Clips y extensiones.","swiftui",{"title":148,"description":149,"slug":150,"category":8,"icon":151},"Tailwind CSS","Cómo damos estilo a cada frontend que construimos: clases de utilidad y design tokens en lugar de una hoja de estilos que solo crece y nunca se borra.","tailwind","logos:tailwindcss-icon",{"title":153,"description":154,"slug":155,"category":19,"icon":156},"TypeScript","Lo predeterminado para todo lo que escribimos para el navegador y para servicios Node: tipos que detectan errores de integración antes de llegar a una revisión.","typescript","logos:typescript-icon",{"title":158,"description":159,"slug":160,"category":8,"icon":161},"Vue","Nuestro framework de frontend para paneles de administración, cuadros de mando y apps web que deben seguir siendo mantenibles durante años.","vue","logos:vue",{"title":163,"description":164,"slug":165,"category":36,"icon":166},"Whisper","El modelo de reconocimiento de voz de código abierto de OpenAI: el motor de transcripción detrás de la entrada por voz, que funciona como servicio de backend y también en el propio dispositivo.","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_es\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},"el-problema","El problema",[179,180,181,182,186,187,190,191,194],"p",{},"El ",[183,184,185],"code",{},"TextEditingController"," que trae Flutter trata los números como texto plano. Cuando un usuario escribe ",[183,188,189],{},"1000000"," en un campo de precio, ve exactamente eso: un muro ilegible de dígitos. No hay agrupación, ni formato decimal, ni símbolo de moneda. Los desarrolladores acaban escribiendo lógica propia de ",[183,192,193],{},"TextInputFormatter",", parseando cadenas a mano y peleándose con errores de posición del cursor cada vez que el formato cambia la longitud del texto.",[179,196,197],{},"Los problemas habituales incluyen:",[199,200,201,205,208,211],"ul",{},[202,203,204],"li",{},"Los usuarios leen mal los números grandes sin separadores de miles",[202,206,207],{},"Campos de moneda que ignoran las convenciones del locale (posición del símbolo, coma frente a punto)",[202,209,210],{},"Código de parseo frágil que se rompe cuando el texto formateado contiene caracteres que no son dígitos",[202,212,213],{},"El cursor saltando a posiciones inesperadas tras cada pulsación",[174,215,217],{"id":216},"cómo-lo-resuelve-number_editing_controller","Cómo lo resuelve number_editing_controller",[179,219,220,223,224,226,227,230],{},[183,221,222],{},"number_editing_controller"," es un reemplazo directo de ",[183,225,185],{},". Asígnalo a cualquier ",[183,228,229],{},"TextField"," y se encarga del formato, el parseo y la gestión del cursor automáticamente.",[179,232,233,234,237,238,241,242,245],{},"El usuario ve texto correctamente formateado como ",[183,235,236],{},"$1,234.56"," o ",[183,239,240],{},"1.234,56 €",", mientras tu código lee el valor numérico limpio a través de ",[183,243,244],{},"controller.number",".",[179,247,248],{},[249,250],"img",{"alt":251,"src":252,"style":253},"Demo de formato de moneda","\u002Fopen-source\u002Fnumber-editing-controller\u002Fcurrency.gif","max-height: 600px; height: auto; width: auto;",[174,255,257],{"id":256},"qué-ofrece","Qué ofrece",[199,259,260,275,281,287,304,314,320],{},[202,261,262,266,267,270,271,274],{},[263,264,265],"strong",{},"Formato de enteros",": agrupa los dígitos con los separadores propios del locale (",[183,268,269],{},"1,000,000"," en inglés, ",[183,272,273],{},"1.000.000"," en alemán)",[202,276,277,280],{},[263,278,279],{},"Formato decimal",": dígitos decimales mínimos y máximos configurables",[202,282,283,286],{},[263,284,285],{},"Formato de moneda",": coloca el símbolo antes o después del número según las reglas del locale",[202,288,289,292,293,296,297,299,300,303],{},[263,290,291],{},"Adaptación al locale",": usa patrones de formato ICU, así que ",[183,294,295],{},"1234.56"," en USD se muestra como ",[183,298,236],{}," en inglés y ",[183,301,302],{},"1.234,56 $"," en alemán",[202,305,306,309,310,313],{},[263,307,308],{},"Números negativos",": flag opcional ",[183,311,312],{},"allowNegative"," para restringir la entrada a valores positivos",[202,315,316,319],{},[263,317,318],{},"Cambios en tiempo de ejecución",": cambia el locale, la moneda o la precisión sobre la marcha sin recrear el controlador",[202,321,322,325,326,328],{},[263,323,324],{},"Símbolo de moneda externo",": muestra el símbolo como decoración prefix\u002Fsuffix del ",[183,327,229],{}," en lugar de como texto en línea",[174,330,332],{"id":331},"casos-de-uso-reales","Casos de uso reales",[334,335,337],"h3",{"id":336},"checkout-de-comercio-electrónico","Checkout de comercio electrónico",[179,339,340,341,343,344,347],{},"Un formulario de pago necesita aceptar importes en varias monedas. Con ",[183,342,222],{}," creas un único controlador de moneda y cambias ",[183,345,346],{},"currencyName"," cuando el usuario elige otra. El campo se reformatea al instante, sin necesidad de reconstruir nada.",[334,349,351],{"id":350},"apps-financieras-con-varios-locales","Apps financieras con varios locales",[179,353,354,355,357,358,357,360,363,364,245],{},"Una app bancaria que atiende a usuarios en EE. UU., Alemania y Japón necesita las convenciones de cada locale: ",[183,356,236],{}," frente a ",[183,359,240],{},[183,361,362],{},"¥1,500",". El controlador gestiona todo esto desde un único parámetro ",[183,365,366],{},"locale",[179,368,369],{},[249,370],{"alt":371,"src":372,"style":253},"Demo de formato de enteros","\u002Fopen-source\u002Fnumber-editing-controller\u002Finteger.gif",[334,374,376],{"id":375},"campos-de-inventario-y-cantidades","Campos de inventario y cantidades",[179,378,379,380,382,383,385],{},"Las apps de almacén manejan cantidades enteras grandes. El controlador de enteros convierte ",[183,381,189],{}," en ",[183,384,269],{},", lo que hace que los errores de introducción de datos sean fáciles de detectar.",[334,387,389],{"id":388},"cuadros-de-mando-analíticos","Cuadros de mando analíticos",[179,391,392,393,396],{},"Los controladores decimales con precisión configurable te permiten dar formato a métricas —porcentajes con 2 dígitos, mediciones científicas con 4— manteniendo disponible el valor ",[183,394,395],{},"num"," en bruto para los cálculos.",[174,398,400],{"id":399},"ejemplos-de-formato-por-locale","Ejemplos de formato por locale",[402,403,404,423],"table",{},[405,406,407],"thead",{},[408,409,410,414,417,420],"tr",{},[411,412,413],"th",{},"Locale",[411,415,416],{},"Tipo",[411,418,419],{},"Valor en bruto",[411,421,422],{},"Mostrado",[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],{},"Moneda (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],{},"Moneda (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],{},"Moneda (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],{},"Moneda (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],{},"Entero",[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],{},"Decimal (máx. 2)",[429,549,550],{},[183,551,552],{},"1234.89",[429,554,555],{},[183,556,557],{},"1.234,89",[174,559,561],{"id":560},"cómo-empezar","Cómo empezar",[179,563,564],{},"Instala el paquete:",[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],{},"Requiere Flutter 3.19+ y Dart 3.3+.",[179,596,597,598,600],{},"Después crea un controlador y asígnalo a tu ",[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 Lee el valor numérico en cualquier momento\nfinal amount = controller.number; \u002F\u002F p. ej. 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 Lee el valor numérico en cualquier momento\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 p. ej. 1234.56\n",[179,779,780,781,784,785,788,789,792],{},"Hay tres tipos de controlador disponibles: ",[183,782,783],{},".integer()",", ",[183,786,787],{},".decimal()"," y ",[183,790,791],{},".currency()",". Todas las opciones —locale, separadores, moneda, precisión— pueden cambiarse en tiempo de ejecución sin recrear el controlador.",[179,794,795,796,245],{},"Tienes un ejemplo completo y funcional, con selector de moneda, cambio de locale y colocación externa del símbolo, en el ",[797,798,802],"a",{"href":799,"rel":800},"https:\u002F\u002Fgithub.com\u002Fnerdy-pro\u002Fflutter_number_editing_controller\u002Ftree\u002Fmain\u002Fexample",[801],"nofollow","directorio de ejemplos",[804,805],"questions",{":items":806},"[{\"title\":\"¿Funciona con Flutter web?\",\"text\":\"Sí, pero JavaScript representa todos los números como flotantes de 64 bits, así que los enteros por encima de 2^53 - 1 (unos 9 mil billones) pierden precisión en silencio. En plataformas nativas, los enteros de 64 bits son totalmente compatibles.\"},{\"title\":\"¿Puedo cambiar la moneda o el locale después de crear el controlador?\",\"text\":\"Sí. Todas las opciones de formato son mutables en tiempo de ejecución. Cambiar el locale, el nombre de la moneda, los separadores o la precisión reformatea de inmediato el texto mostrado sin recrear el controlador.\"},{\"title\":\"¿Admite la numeración india (lakh\u002Fcrore)?\",\"text\":\"Todavía no. La librería usa tamaños de grupo uniformes derivados de los patrones de locale de ICU (normalmente grupos de 3). Los sistemas de agrupación de anchura variable, como la numeración india, no se admiten.\"},{\"title\":\"¿Cómo muestro el símbolo de moneda fuera del campo de texto?\",\"text\":\"Pon showCurrencySymbol a false y usa las propiedades resolvedCurrencySymbol y currencySymbolPosition para colocar el símbolo como decoración prefix o suffix del TextField.\"},{\"title\":\"¿Qué pasa con números muy largos?\",\"text\":\"La precisión decimal está limitada a 20 dígitos decimales (el límite de toStringAsFixed de Dart). Las entradas extremadamente largas pueden degradar el rendimiento del formato, pero los valores financieros y de negocio habituales se manejan sin problemas.\"}]",[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},"Un TextEditingController que da formato a números, decimales y monedas mientras el usuario escribe, con soporte completo de locales.","md",[827],{"type":828,"url":829},"pub_dev","https:\u002F\u002Fpub.dev\u002Fpackages\u002Fnumber_editing_controller",{},null,"Un TextEditingController que formatea números, decimales y monedas mientras el usuario escribe, en la configuración regional que tenga.","\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","R_YKd_Js7qw-3U3dpjLeMBw3drjQ2N9zOJQzmD_7Cf8",{"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"]