Tausendertrennzeichen mit Fehlerprüfung (JS)
Manchmal soll eine durch den User eingegebene Zahl mit Tausendertrennzeichen und Dezimalstellen formatiert werden. Das Ergebnis soll aber weiterhin editierbar bleiben. D.h. bereits eingefügte Tausendertrennzeichen oder Dezimaltrenner sollen ein erneutes Formatieren nicht behindern. Nachfolgendes Script ist ein Versuch, oben genannte Anforderungen umzusetzen.
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 aufgesplittet, ausgehend von dem gefundenen Zeichent. Der ganzzahlige Anteil wird anschliessend von eventuell enthaltenen Kommata und Punkten gereinigt.
Danach 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 Tausendertrenn- zeichen versehen und bei Bedarf mit der gewünschten Anzahl an Dezimalstellen versehen.
Durch die umständlichere 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.
JavaScript
function formatNumber(strZahl, intDezStellen/*, strDelimiter/*){
// 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);
}
Beispiel
Zum Schluss noch ein Beispiel, dass die Funktionsweise demonstrieren soll.

Neuer Kommentar
Weitere Themen
Weitere Artikel
- Grafischer Countdown (JS, ...
- Fortschrittsanzeige mit J ...
- Selektierte Einträge aus ...
- Fader mit jQuery (JS)
- Ticker (JS)
- Reflexion (JS)
- Animierte Wertungsbalken ...
- Fadenkreuz (JS)
- Slideshow (JS)
- Tausendertrennzeichen mit ...