In Javascript sind die Formatier-Funktionen toString(), toFixed(), toPrecision() und toExponential() verglichen mit den hier vorgestellten Funktionen sehr limitiert. Der NumFormatter wandelt Zahlen in verschiedenste Formate, incl. wissenschaftlichen Formaten in gewählter Genauigkeit und Stellenanzahl. Zudem werden Zahlen mit Tausender-Trennzeichen versehen und es werden landesübliche Formatierungen unterstützt.
Die Formatier-Funktionen sind in einem globalen Objekt NumFormatter implementiert. Es stellt folgende Eigenschaften und Methoden zur Verfügung:
Siehe Optionen und Funktionen für eine detaillierte Beschreibung.
Grosse Zahlen sind ohne Formatierung nur schwer lesbar und die Ausgabe einer Zahl mit mehr als ein paar Digits macht ausser bei Finanzprogrammen keinen Sinn. Die eingangs erwähnten Formatier-Funktionen von Javascript mögen für viele Anwendungen ausreichend sein. Sie geben jedoch Zahlen nicht in einem Format zurück, welches den landesüblichen Empfehlungen oder Normen entsprechen. Hier springt das NumFormatter Objekt ein.
Beispiele für die Formatierung grosser Zahlen in verschiedenen Ländern:
Schweiz | 12'345'678.90123456 |
Deutschland | 12.345.678,90123456 |
England/USA | 12,345,678.90123456 |
nach ISO | 12 345 678,901 234 56 |
Zur Verbesserung der Lesbarkeit dürfen die Nachkommastellen durch Leerzeichen gruppiert werden.
Javascript verlangt ein genau festgelegtes Format bei der String-Darstellung, damit diese mit parseFloat() korrekt interpretiert und in das interne Format Number gewandelt werden kann. So dürfen keine Trenn- oder Gruppierungszeichen verwendet werden und als Dezimal-Trennzeichen muss der Punkt verwendet werden.
Der NumFormatter stellt die Funktion StringToNum zur Verfügung, mit landesüblich formatierte Zahlen aus Eingabefeldern korrekt in eine Number konvertiert werden können.
Intern rechnet Javascript beim Objekttyp Number mit 52 Binärstellen, was ca. 17 Dezimalstellen entspricht, und einem Exponenten von -324 bis 308. Immer wenn eine Zahl in einen String gewandelt werden muss, also zum Beispiel bei der Ausgabe einer Zahl in einem Text, verwendet Javascript die Funktion toString(). Dabei werden von der Zahl soviele Digits ausgegeben, wie für ihre eindeutige interne Darstellung nötig sind. Das heisst, wird eine solche Zahl mit parseFloat() wieder in die interne Darstellung konvertiert, so ist diese mit der ursprünglichen Zahl identisch.
Dabei entsteht folgendes Problem: Javascript rechnet intern im 2er-System (Binärsystem), nicht im Dezimalsystem. Daher kann es bei Berechnungen zu unschönen Rundungsfehlern kommen, obwohl im Dezimalsystem die Zahlen ohne Problem exakt berechnet werden könnten.
Beispiel: Die Berechnung von 3 · 10−1 ergibt im Dezimalsystem exakt 0,3. Im Binärsystem von Javascript ergibt dies jedoch 3 · Math.pow(10,−1) = 0,300 000 000 000 000 04!
Praktisch ist diese Abweichung nicht relevant. Es ist jedoch sehr unschön, wenn statt 0,3 eine solche monströse Zahl ausgegeben wird. Daher werden Zahlen vom NumFormatter bei der Ausgabe auf eine Genauigkeit von maximal 16 Digits gerundet.