parseQuantityMilli function

int? parseQuantityMilli(
  1. String text,
  2. String? unit, {
  3. QuantityRule? rule,
})

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 Einheit null: 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 rule sagt (die gespeicherte Mengenregel des Artikels, PosArticle.quantityRule), ohne rule die 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;
}