|
FAQ de.comp.lang.javascript |
|
Bitte verwenden Sie als Einstiegsadresse in diese FAQ die
Homepage der Newsgroup de.comp.lang.javascript.
Der Aufenthaltsort dieser Seiten hier kann sich ohne Vorwarnung ändern.
Anders als ihre Entsprechungen in manchen anderen Programmiersprachen kennt die Methode Math.round() keinen Parameter für die Stelle, an der gerundet werden soll: das Ergebnis ist immer eine ganze Zahl. Um eine Zahl auf eine bestimmte Anzahl Nachkommastellen zu runden, müssen wir zuerst das Komma nach rechts verschieben (Multiplikation mit einer Zehnerpotenz), dann auf eine ganze Zahl runden und anschließend das Komma wieder an seine ursprüngliche Stelle bringen (Division durch dieselbe Zehnerpotenz). Für beispielsweise 4 Nachkommastellen sieht das so aus:
Ein Problem kann es dabei aber sein, wenn als Ergebnis der Rundung weniger Nachkommastellen ausgegeben werden als eigentlich gewüscht:
Eine Methode, die einen Zahlenwert in einen String mit festgelegter Formatierung umwandelt, fehlt in JavaScript. Wir müssen uns daher selbst eine Funktion schreiben, die einen Zahlenwert auf n Stellen rundet und gegebenenfalls Nullen am Ende erhält. Diese kann z.B. wie folgt aussehen. Bevor jedoch hier jemand laut protestiert, weise ich schnell noch darauf hin, daß diese Funktion im nächsten Abschnitt dann stark vereinfacht wird ...
function runde(x, n) { if (n < 1 || n > 14) return false; var e = Math.pow(10, n); var k = (Math.round(x * e) / e).toString(); if (k.indexOf('.') == -1) k += '.'; k += e.toString().substring(1); return k.substring(0, k.indexOf('.') + n+1); }
Wie funktioniert dies? Wir übergeben der Funktion zwei Parameter (Zeile 1): x ist der zu rundende Wert, n die Anzahl der gewünschten Nachkommastellen. Zunächst überprüfen wir n auf den sinnvollen Wertebereich 1..14: liegt n außerhalb, geben wir false zurück (Zeile 2). Dann berechnen wir den Faktor e zu 10n (Zeile 3) - dies entspricht den 10000 in den beiden Beispielen oben. Die nun folgende Berechnung ist die gleiche wie in diesen beiden Beispielen - nur wandeln wir anschließend das Ergebnis in eine Zeichenkette um (Zeile 4). War das Ergebnis ganzzahlig, fügen wir einen Dezimalpunkt an (Zeile 5). Aus e können wir uns leicht eine Zeichenkette aus n Nullen erzeugen (Zeile 6), diese hängen wir an unser bisheriges Ergebnis an. Alles das können wir zuletzt auf die gewünschte Länge, n Stellen hinter dem Dezimalpunkt, zuschneiden und zurückgeben (Zeile 7).
Der häufigste Grund, eine Zahl mit JavaScript zu runden, ist sicherlich die korrekte Ausgabe eines Geldbetrages. Bei dieser sogenannten kaufmännischen Rundung steht die Zahl der Nachkommastellen fest: jede Zahl muß genau zwei Nachkommastellen aufweisen. Wir können die Funktion runde() aus dem letzten Abschnitt daher stark vereinfachen: n ist immer gleich zwei, e daher gleich 100 und die Zeichenkette aus n Nullen gleich "00". Es bleibt nur dies übrig:
function kaufm(x) { var k = (Math.round(x * 100) / 100).toString(); k += (k.indexOf('.') == -1)? '.00' : '00'; return k.substring(0, k.indexOf('.') + 3); }
Wollen wir statt des Dezimalpunktes ein Dezimalkomma ausgeben, müssen wir die Zeichenkette zerschneiden: Zunächst geben wir alle Zeichen bis zu dem vor dem Punkt aus, dann ein Komma und zuletzt die beiden Zeichen, die auf den Punkt folgen. Die Funktion aus dem letzten Abschnitt, um dies erweitert, sieht dann so aus:
function kaufm(x) { var k = (Math.round(x * 100) / 100).toString(); k += (k.indexOf('.') == -1)? '.00' : '00'; var p = k.indexOf('.'); return k.substring(0, p) + ',' + k.substring(p+1, p+3); }
Netscapes Navigator gibt keine führenden Nullen vor dem Dezimalpunkt aus. Während der Internet Explorer beispielsweise für ein Zehntel "0.1" und für minus ein Fünftel "-0.2" anzeigt, liefert Netscape ".1" und "-.2". Wollen wir die Funktion aus dem letzten Abschnitt noch so ergänzen, daß in diesen Fällen eine Null vor dem Komma ergänzt wird, müssen wir feststellen, ob unsere Zeichenkette mit "." oder mit "-." beginnt - in diesen Fällen wird in der nachstehenden Funktion p gleich null bzw. m gleich null sein (Zeile 4). In diesen Fällen müssen wir, statt eines Kommas, "0," einfügen (Zeile 5). Alles zusammen sieht schließlich so aus:
function kaufm(x) { var k = (Math.round(x * 100) / 100).toString(); k += (k.indexOf('.') == -1)? '.00' : '00'; var p = k.indexOf('.'), m = k.indexOf('-.'); var f = (p == 0 || m == 0)? '0,' : ','; return k.substring(0, p) + f + k.substring(p+1, p+3); }
Diese Seite ist Teil der de.comp.lang.javascript FAQ. Die Einstiegsadresse lautet http://www.dcljs.de/. Der Text der Seite wurde erstellt von Dietmar H. G. Meier (©).
______ letzte Änderung: 12/2012 ______
© S. Mintert, Ch. Kühnel