parseQuantityMilli function
Eine eingetippte Menge in Tausendstel der Basiseinheit, ohne
Gleitkomma: '12' → 12000, '0,25' → 250, '1.5' → 1500.
Zwilling von parseQuantityMilli im JS-Paket; gemeinsame Prueffaelle in
stocktake-quantity-cases.json des Vertrags.
- Dezimaltrenner Komma oder Punkt, hoechstens drei Nachkommastellen;
weitere Nullen am Ende zaehlen nicht (
'1,2340'→1234).'0'ist eine gueltige Menge (leer gezaehlt). - Punkt mit genau drei Ziffern danach und einem Ganzteil ungleich 0
(
'1.000','12.500') ist bei jeder Einheitnull: in oesterreichischer Schreibweise ist das ein Tausenderpunkt („tausend“), am Ziffernblock ein Dezimalpunkt („eins“); einen Faktor 1000 buchte der Abschluss als Differenz. Mit Komma ist es eindeutig ('1,000'→1000), ebenso'0.500','1.5','1.25'. - Stueckware nur als ganze Zahl ohne Trenner. Stueckware ist, was
rulesagt (die gespeicherte Mengenregel des Artikels,PosArticle.quantityRule), ohneruledie Vorgabe der Einheit (quantityRuleForUnit: Stk, g, ml …, auch ohne Einheit). Einzelstuecke (Seriennummer) sind immer Stueckware: dann QuantityRule.piece uebergeben.
null auch fuer: leer, Vorzeichen, Tausenderleerzeichen, Exponent, mehr als
drei Nachkommastellen, groesser als die groesste sichere Ganzzahl von
JavaScript. Die Kasse zeigt dann ihren Satz (stocktake.quantity_invalid),
statt still zu runden.
Implementation
int? parseQuantityMilli(String text, String? unit, {QuantityRule? rule}) {
final m = _mengenMuster.firstMatch(_jsTrim(text));
if (m == null) return null;
final ganz = m[1] ?? '';
final trenner = m[2];
final roh = m[3] ?? '';
if (ganz.isEmpty && roh.isEmpty) return null;
final stueck = (rule ?? quantityRuleForUnit(unit).rule) == QuantityRule.piece;
if (trenner != null && stueck) return null;
if (trenner == '.' && roh.length == 3 && _ziffernOhneNull.hasMatch(ganz)) return null;
final nachkomma = roh.replaceFirst(RegExp(r'0+$'), '');
if (nachkomma.length > _stellen) return null;
// BigInt: eine lange Ziffernfolge laeuft sonst ueber, statt `null` zu werden.
final milli = BigInt.parse(ganz.isEmpty ? '0' : ganz) * BigInt.from(1000) + BigInt.parse(nachkomma.padRight(_stellen, '0'));
return milli <= _groessteSichereGross ? milli.toInt() : null;
}