betragAusText function
Betrag aus dem Eingabefeld in ganzen Cent — oder null.
Gelesen wird ueber die Ziffern, ausdruecklich nicht ueber eine Fliesskommazahl mit anschliessender Multiplikation. Komma und Punkt sind beide zugelassen (auf einer Bildschirmtastatur liegt oft nur eines davon). Abgewiesen wird alles andere, insbesondere drei Nachkommastellen (eine falsche Eingabe, keine Aufforderung zum Runden — wer hier rundete, entschiede am Kassier vorbei ueber Geld) und 0,00 oder negativ (ein Nullbeleg entsteht nicht hier, und ein Storno ist eine eigene Handlung mit eigenem Beleg) sowie alles ueber hoechstbetragCent — der Deckel, den der Kommentar dort seit jeher beschreibt und den bis hierher niemand pruefte.
Implementation
int? betragAusText(String text) {
final treffer = RegExp(r'^(\d+)(?:[.,](\d{1,2}))?$').firstMatch(text.trim());
if (treffer == null) return null;
final ganzeText = treffer.group(1)!;
// Mehr Stellen, als der Deckel je zulaesst: hier warf `int.parse` ab 19
// Ziffern eine `FormatException`, statt wie zugesagt `null` zu liefern —
// erreichbar ueber eine haengende Taste oder eine eingefuegte Zeichenkette.
if (ganzeText.length > 9) return null;
final ganze = int.parse(ganzeText);
// Auf zwei Stellen aufgefuellt: „4,5" sind 50 Cent und nicht 5.
final nachkommaText = (treffer.group(2) ?? '').padRight(2, '0');
final nachkomma = nachkommaText.isEmpty ? 0 : int.parse(nachkommaText);
final cents = ganze * 100 + nachkomma;
if (cents <= 0 || cents > hoechstbetragCent) return null;
return cents;
}