Tausendertrennzeichen mit Fehlerprüfung
JavaScript (Reguläre Ausdrücke)
Funktionsweise
Das hier vorgestellte Script Prüft einen übergebenen Zahlenstring zunächst darauf, ob er einen Dezimalanteil enthält. Hierbei ist das am weitesten rechts gefundene Zeichen (Punkt oder Komma) entscheidend. Ersetzt wird es bei erfolgreicher Suche durch den Dezimalpunkt.
Anschliessend wird die Zahl in Ganz- und Dezimalanteil ausgehend von dem gefundenen Zeichen aufgesplittet. Der ganzzahlige Anteil wird anschliessend von eventuell enthaltenen Kommata und Punkten gereinigt.
Anschliessend wird noch geprüft, ob es sich um eine Zahl handelt. D.h. ob eventuell noch andere Zeichen als Ziffern und der Dezimalpunkt gefunden werden.
Zu guter letzt wird der String mit den notwendigen Tausendertrennzeichen versehen und bei Bedarf mit zwei Dezimalstellen versehen.
Durch die umstänglichere Prüfung zu Beginn der Routine ist es möglich, mit dem Wert aus dem Inputfeld direkt weiter zu arbeiten. Der User kann also eventuelle Fehler korrigieren, ohne eine Fehlermeldung wegen falscher Zeichen (Komma) zu erhalten.
Beispiel - Tausendertrennzeichen mit Fehlerprüfung
Quellcode zum Beispiel
Der folgende Quellcode zeigt die oben vorgestellte Routine.
JavaScript:
function formatNumber(strZahl, intDezStellen){
// Variablen vorbelegen
strDelimiter = (typeof(strDelimiter)=="undefined") ? "." : strDelimiter;
intDezStellen = (typeof(intDezStellen)=="undefined") ? 2 : intDezStellen;
// Tausendertrennzeichen eventuell maskieren
var strDelimiterMask = (strDelimiter.match(/(\.|\+|\*|\?|\^|\(|\)|\$)/))?"\\"+strDelimiter:strDelimiter;
// Falls ein Komma oder Punkt am Ende existiert
if(strZahl.match(/^(.*)(,|\.)(\d+)$/)){
// Durch Punkt ersetzen
strZahl = strZahl.replace(/^(.*)(,|\.)(\d+)$/, RegExp.$1+"."+RegExp.$3);
}
// Zahl in Dezimal- und Ganzzahlanteil splitten
var strFirst = strZahl.substring(0, strZahl.length-RegExp.$3.length-1);
var strSecond = strZahl.substring(strZahl.length-RegExp.$3.length-1, strZahl.length);
// Suchmaske für Tausendertrennzeichen
strPattern = eval("/(,|"+strDelimiterMask+")/");
// Solange im Ganzzahlanteil Punkte oder Kommata gefunden werden
while(strFirst.match(strPattern)){
// Punkte entfernen
strFirst = strFirst.replace(strPattern, "");
}
// Ganz- und Dezimalanteil wieder zusammenführen
strZahl = strFirst + strSecond;
// Falls keine gültige Zahl eingegeben wurde
if(isNaN(Number(strZahl))){
alert("Keine gültige Zahl eingegeben!\n- Keine Tausendertrennzeichen\n- Dezimalpunkt statt Komma)");
return "";
}
// Mögliche Dezimalstellen auf 2 Stellen runden und Dez-Punkt durch Komma ersetzen
strZahl = String(Number(strZahl).toFixed(intDezStellen)).replace(/\./,",");
// Solange noch mindestens vier Ziffern am Anfang gefunden werden
while(strZahl.match(/^(\d+)(\d{3}\b)/)){
// Tausendertrennzeichen einfügen
strZahl = strZahl.replace(/^(\d+)(\d{3}\b)/, RegExp.$1 + strDelimiter + RegExp.$2);
}
return(strZahl);
}
Der Funktion können zwei Parameter übergeben werden:
- strZahl - die Zahl, die formatiert werden soll, als String
- intDezStellen - Anzahl der Stellen nach dem Komma