Het probleem

De ingebouwde TextEditingController van Flutter behandelt getallen als platte tekst. Typt een gebruiker 1000000 in een prijsveld, dan ziet hij precies dat — een onleesbare muur cijfers. Geen groepering, geen decimale opmaak, geen valutasymbool. Developers blijven achter met eigen TextInputFormatter-logica, handmatig tekenreeksen ontleden, en gevechten met de cursorpositie telkens als de opmaak de tekstlengte verandert.

Veelvoorkomende problemen:

  • Gebruikers lezen grote getallen verkeerd zonder duizendtalscheiding
  • Valutavelden die de conventies van de taalregio negeren (plaats van het symbool, komma of punt)
  • Broze ontleedcode die stukgaat zodra de opgemaakte tekst niet-cijfers bevat
  • Een cursor die na elke toetsaanslag naar een onverwachte plek springt

Hoe number_editing_controller dat oplost

number_editing_controller is een directe vervanger voor TextEditingController. Wijs hem toe aan een willekeurig TextField en hij regelt opmaak, ontleden en cursorbeheer vanzelf.

De gebruiker ziet netjes opgemaakte tekst als $1,234.56 of 1.234,56 €, terwijl jouw code de schone numerieke waarde uitleest via controller.number.

Wat het ondersteunt

  • Opmaak van hele getallen — groepeert cijfers met de scheidingstekens van de taalregio (1,000,000 in het Engels, 1.000.000 in het Duits)
  • Decimale opmaak — instelbaar minimum en maximum aantal decimalen
  • Valuta-opmaak — plaatst het valutasymbool vóór of na het getal volgens de regels van de taalregio
  • Bewust van taalregio's — gebruikt ICU-opmaakpatronen, zodat 1234.56 in USD in het Engels als $1,234.56 verschijnt en in het Duits als 1.234,56 $
  • Negatieve getallen — optionele allowNegative-vlag om invoer tot positieve waarden te beperken
  • Wijzigen tijdens het draaien — wissel van taalregio, valuta of precisie terwijl de app draait, zonder de controller opnieuw te maken
  • Extern valutasymbool — toon het symbool als voor- of achtervoegsel in de TextField-decoratie in plaats van in de tekst zelf

Toepassingen in de praktijk

Afrekenen in een webwinkel

Een betaalformulier moet bedragen in meerdere valuta aannemen. Met number_editing_controller maak je één valutacontroller en wijzig je currencyName zodra de gebruiker een andere valuta kiest. Het veld maakt zichzelf direct opnieuw op — zonder herbouw.

Financiële apps voor meerdere taalregio's

Een bankapp die gebruikers in de VS, Duitsland en Japan bedient, heeft per regio eigen conventies nodig: $1,234.56 tegenover 1.234,56 € tegenover ¥1,500. De controller regelt dat allemaal via één locale-parameter.

Velden voor voorraad en aantallen

Magazijnapps werken met grote hele aantallen. De integer-controller maakt van 1000000 netjes 1,000,000, waardoor invoerfouten meteen opvallen.

Analysedashboards

Decimale controllers met instelbare precisie laten je meetwaarden opmaken — percentages met 2 cijfers, wetenschappelijke metingen met 4 — terwijl de ruwe num-waarde beschikbaar blijft om mee te rekenen.

Voorbeelden van opmaak per taalregio

TaalregioTypeRuwe waardeWeergegeven
enValuta (USD)1234.56$1,234.56
deValuta (EUR)1234.561.234,56 €
frValuta (EUR)1234.561 234,56 €
jaValuta (JPY)1500¥1,500
ruValuta (RUB)500500 ₽
enHeel getal12345671,234,567
deDecimaal (max 2)1234.891.234,89

Aan de slag

Installeer het pakket:

flutter pub add number_editing_controller

Vereist Flutter 3.19+ en Dart 3.3+.

Maak vervolgens een controller en wijs hem toe aan je TextField:

final controller = NumberEditingTextController.currency(
  currencyName: 'USD',
  locale: 'en',
);

TextField(
  controller: controller,
  keyboardType: TextInputType.numberWithOptions(decimal: true, signed: true),
)

// Lees de numerieke waarde op elk moment
final amount = controller.number; // e.g. 1234.56

Er zijn drie soorten controllers beschikbaar: .integer(), .decimal() en .currency(). Alle opties — taalregio, scheidingstekens, valuta, precisie — zijn tijdens het draaien te wijzigen zonder de controller opnieuw te maken.

Een compleet werkend voorbeeld met een valutakiezer, een taalregiokiezer en een extern geplaatst symbool staat in de voorbeeldmap.

Ja, maar JavaScript stelt alle getallen voor als 64-bits drijvendekommagetallen, dus hele getallen boven 2^53 - 1 (ongeveer 9 biljard) verliezen stilzwijgend precisie. Op native platforms worden 64-bits gehele getallen volledig ondersteund.
Ja. Alle opmaakopties zijn tijdens het draaien te wijzigen. Taalregio, valutanaam, scheidingstekens of precisie aanpassen maakt de getoonde tekst direct opnieuw op, zonder de controller opnieuw te maken.
Nog niet. De bibliotheek gebruikt gelijke groepsgroottes afgeleid uit ICU-patronen per taalregio (meestal groepen van 3). Groeperingssystemen met wisselende breedte, zoals de Indiase nummering, worden niet ondersteund.
Zet showCurrencySymbol op false en gebruik de eigenschappen resolvedCurrencySymbol en currencySymbolPosition om het symbool als voor- of achtervoegsel in de TextField-decoratie te plaatsen.
De decimale precisie is begrensd op 20 cijfers achter de komma (de limiet van toStringAsFixed in Dart). Uitzonderlijk lange invoer kan de opmaakprestaties verslechteren, maar gangbare financiële en zakelijke waarden worden zonder problemen verwerkt.