Hallo Franz,
einatmen. Ausatmen. Ruhe. Ok?
Den Replace brauchst Du nur einmal. In der Function. Vor dem parseFloat. Aber wenn Du a-zA-Z in den replace mit hinein nimmst, dann bleiben auch die ASCII Buchstaben stehen. Der Replace, den du außerhalb der Funktion aufrufst, wäre richtig. Nur geht der schief, weil die Funktion keinen String, sondern eine Zahl liefert. Also: Replace außerhalb der Funktion weg, und beim Replace innerhalb der Funktion die Regex fixen.
Das ist aber nur das Lesen des Wertes als Zahl, und damit nur die halbe Miete. Wenn Du die Tausendertrenner und das Eurozeichen im Input sichtbar haben willst, dann müsstest Du während der Benutzereingabe ständig nachkorrigieren. Und das verhagelt dem Anwender die Freude an der Eingabe, weil das Überschreiben des Wertes den Cursor ans Feldende stellt. Und den korrekt nachzuführen, macht die von mir erwähnte Mühe. Du kannst input-Inhalte nach Verlassen des Feldes natürlich per Script formatieren.
Noch ein Tipp: Der parseFloat sollte dann eigentlich immer gelingen, außer wenn keine einzige Ziffer im Feld stand. Dann gibt's NaN. An der Stelle kannst Du Dir zu Nutze machen, dass NaN ein falsy value ist, d.h. bei booleschen Vergleichen wie FALSE behandelt wird. Du kannst Dir weiterhin zu Nutze machen, dass die booleschen Operatoren && und || nicht true und false zurückgeben, sondern einen ihrer Operanden.
a && b ergibt a wenn a falsy ist und b, wenn a truthy ist.
a || b ergibt a, wenn a truthy ist und b, wenn a falsy ist.
Demnach ist parseFloat(xyz) || 0
ein einfaches Mittel, um ein NaN Ergebnis auf 0 umzusetzen.
Also (mit Trennung von Lesen und Konvertieren):
function getInputAsFloat(element) {
let inhalt = element.value.replace(/[^0-9 ]/g, "");
let value = parseFloat(inhalt);
return value || 0;
}
oder als Einzeiler
function getInputAsFloat(element) {
return parseFloat(element.value.replace(/[^0-9 ]/g, "")) || 0;
}
Rolf
sumpsi - posui - obstruxi