JS: StringUtil.formatNumeric mit decimalPlaces

  • Vielleicht übersehe ich etwas. Ich versuche eine Zahl zu Formatieren und möchte danach zwei Kommastellen haben.


    Hier ein ganz simples Beispiel

    Eigentlich ging ich davon aus das der Parameter decimalPlaces wie der Name vermuten lässt die Anzahl Dezimalstellen übergibt. Dem scheint aber nicht so zu sein.

    Code
    let myNumber = 99.20;
    let calc = myNumber + 20.50;
    // Ziel wäre 119,70
    console.log(1, StringUtil.formatNumeric(calc)); //Ergebnis: 119,7
    console.log(2, StringUtil.formatNumeric(calc, 2)); //Ergebnis: 100

    Ist hier einfach der Parametername unglücklich oder liegt hier ein Fehler vor?

  • $maxDecimals ist hier als Maximum zu verstehen (deswegen auch max), heißt aber nicht, dass immer 2 Nachkommastellen angezeigt werden. Wenn du das willst, empfehle ich dir eine eigene Funktion mit number_format zu schreiben.

  • Danke. Darf ich fragen wie du auf maxDecimals kommst?

    WoltLab nennt diese ja Explicit decimalPlaces und nichts mit max. Und auch wenn es als Max bezeichnet wäre würde es nicht erklären weshalb das Ergebnis mit der Angabe von decimalPlaces 100 ausgibt anstelle der korrekten Berechnung.

    • Official Post

    Hallo,


    die decimalPlaces müssen negativ angegeben, da diese bei der Berechnung des Exponenten verwendet wird. JavaScript kennt beim Runden das Konzept von Nachkommastellen nicht. Um die Funktionalität zu erreichen wird die Zahl entsprechend um einen Exponenten ergänzt, der nach dem Runden wieder abgezogen wird:

    Code
    // Runden auf bis zu zwei Nachkommastellen
    let value = 123.456;
    value = +`${value}e2`;
    value = Math.round(value);
    value = +`${value}e-2`;
    console.log(value); // 123.46


    Es ist allerdings nicht unbedingt intuitiv, weshalb ein negativer Exponent erfordert wird, statt den Exponenten einfach bei der Berechnung zu negieren.


    Ich versuche eine Zahl zu Formatieren und möchte danach zwei Kommastellen haben.

    Das wird so auch nicht ohne weiteres gehen, denn Nullen am Ende werden automatisch verworfen. Deshalb haben wir z. B. auch in Templates die Unterscheidung von {#$value} und {$value|currency}.


    Das bedeutet für dich: Mangels eines Gegenstücks dafür musst du dich selbst darum kümmern, dass die Nachkommastellen bei Bedarf ergänzt werden. Das Dezimaltrennzeichen kannst du über Language.get("wcf.global.decimalPoint") abfragen.

    Alexander Ebert
    Senior Developer WoltLab® GmbH