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

Mit dem nachstehenden JavaScript wird die oben beschriebene Vorgehensweise realisiert.

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);
}
Quellcode: Tausendertrennzeichen mit Fehlererkennung

Beispiel

Zum Schluss noch ein Beispiel, dass die Funktionsweise demonstrieren soll.

Autor: Quaese (06. Juni 2006) | 0 Kommentare
Foto: aboutpixel.de | Mercury01
[top]

Neuer Kommentar

Kommentar
Name:
eMail:
Kommentar:
(max: 500 Zeichen)
Schutz:

Wegen des erhöhten Spamaufkommens muss eine Zeichenfolge als Sicherheitsabfrage eingegeben werden.

captcha

Lösung:

 
Aktualisiert: 04. Juli 2008
Quaese, 2005