WaBis

walter.bislins.ch

Javascripts: Zahlen konvertieren und formatieren (NumFormatter)

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.

Diese Seite ist in Arbeit...

Eigenschaften

Die Formatier-Funktionen sind in einem globalen Objekt NumFormatter implementiert. Es stellt folgende Eigenschaften und Methoden zur Verfügung:

  • Formatierungen: Standard (std), Precision (prec), Fixed (fix), Weak (weak), Scientific (sci), sowie Engineering (eng) mit und ohne Einheiten-Präfix
  • Rundung auf gewünschte Anzahl Stellen
  • Begrenzung der Länge
  • Formatierung mit Tausender-Trennzeichen und Nachkomma-Gruppierung möglich
  • Landesübliche Darstellungen von Dezimalpunkt/-komma und Trennzeichen
  • Einstellung der Darstellung des Exponenten
  • Funktion zum Zurückwandeln einer formatierten Zahl in eine Number

Siehe Optionen und Funktionen für eine detaillierte Beschreibung.

Formatierung von Zahlen

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.

Zahlen aus Formularfeldern

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.

Rundungsfehler

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.

Weitere Infos zur Seite
Erzeugt Samstag, 27. Juli 2013
von wabis
Zum Seitenanfang
Geändert Samstag, 18. Juli 2015
von wabis