/* Beträge im deutschen Format lesen und schreiben. * * Dieselbe Regel wie KontenController::zahl(): ohne Komma entscheidet die * Stellenzahl, ob der Punkt Tausender- oder Dezimaltrenner ist. Die Maske und * das Kontoblatt rechnen beide Restbeträge mit – deshalb steht das hier und * nicht zweimal. */ (function () { 'use strict'; function zahl(text) { const bereinigt = String(text).replace(/[\s€]/g, ''); if (bereinigt === '') { return 0; } if (bereinigt.indexOf(',') !== -1) { return parseFloat(bereinigt.replace(/\./g, '').replace(',', '.')) || 0; } const punkte = (bereinigt.match(/\./g) || []).length; const letzter = bereinigt.split('.').pop(); if (punkte > 1 || (punkte === 1 && letzter.length === 3)) { return parseFloat(bereinigt.replace(/\./g, '')) || 0; } return parseFloat(bereinigt) || 0; } function formatiere(wert) { return wert.toLocaleString('de-DE', { minimumFractionDigits: 2, maximumFractionDigits: 2 }); } /* Die Summe der Splitzeilen unter `felder` gegen `ziel` – das Ergebnis geht * so in die Anzeige, wie beide Masken es brauchen. Angezeigt wird der noch * offene Restbetrag (ziel - summe), nicht die Summe der Zeilen selbst: Nur * so sieht man auf einen Blick, was noch fehlt. */ function splitsumme(felder, ziel) { let summe = 0; let belegt = false; felder.forEach(function (feld) { if (feld.value.trim() === '') { return; } belegt = true; summe += zahl(feld.value); }); const rest = Math.round((ziel - summe) * 100) / 100; return { belegt: belegt, summe: summe, rest: rest, text: formatiere(rest) }; } window.FmBetrag = { zahl: zahl, formatiere: formatiere, splitsumme: splitsumme }; })();