Zahlen richtig formatieren

  • Hey zusammen,

    ich stehe vor einer Herausforderung mit Zahlen bei der ich gerade einfach nicht weiterkomme.

    Situation:

    Ich habe 2 Zahlen. Sagen wir mal die Zahl 5,45 - 2 mal. Nun wenn ich diese mal 2 nehme komme ich auf 9,9. Alles auch korrekt.

    Ich möchte nun jedoch, dass bei solchen Ergebnissen, oder auch bei Ergebnissen bei denen keine Nachkommazahl kommt mindestens 2 stehen haben.

    Bedeutet:
    9,9 wird zu 9,90

    9 wird zu 9,00

    Ich habe nun echt viel mit ausprobiert. Mit den Funktionen round(), number_format() mit 2 Nachkommastellen als Parameter.

    Doch bei round wird z.B. 9,9 auf 9 bei folgendem Code abgerundet:
    round($zahl, 2); Warum kann ich mir nicht erklären.

    Bei number_format() werden mir trotz Angabe von 2 Nachkommazahlen in diesem Fall nur 1 oder keine angezeigt.

    Außerdem habe ich schon mit floor, sprintf (Floatzahl) und Divisionen es ausprobiert. Da kam auch immer das gleiche raus.

    Habt ihr Ideen wie ich es hinbekomen kann?

    Schöne Grüße,

    Stef

  • Das hier

    macht bei mir diese Ausgabe

    9.90
    9.00
    9.00
    999.99


    EDIT:

     bcdiv()  scheint auch zu funktionieren

    Code
    $numbers=['9','99','99.9999','9999.9999',9,99,99.9999,9999.9999];
    foreach($numbers as $val){
         echo bcdiv($val, 1, 2).'<br>'; 
    }

    Ausgabe

    9.00
    99.00
    99.99
    9999.99
    9.00
    99.00
    99.99
    9999.99

    2 Mal editiert, zuletzt von basti1012 (25. Juni 2020 um 02:03)

  • Hey,

    vielen Dank für euere Tipps und Hilfe.

    Ich habe folgende Zahlen:

    PHP
    $price = "3.34";
    $productCount = (int) filter_var(trim($_POST["produktanzahl"]), FILTER_VALIDATE_INT);
    
    $pay = ($price * $productCount);
    
    // Wenn ich nun auf die Rechnung ein round anwende wird keine Rundung vorgenommen sondern die Kürzung.
    // $pay = round(($price * $productCount), 2); -> Ergebnis bei 9.9 = 9

    Ich habe bei number_format() der Funktion eine vordefenierte float mitgegeben, was nicht funktioniert hat. Nun wenn man die Zahl dirket in der Funktion als float setzt funktioniert es.

    Mir kommt als einzigste Idee, dass die vorige Zahl dann kein Float ist aber es ist ein Float.

    Warum ist das denn so?

    Schöne Grüße,
    Stef

  • Ich kann machen was ich will, bei mir funktioniert das round() einwandfrei, wie man es erwartet. Ich vermute, dass das Problem außerhalb des Codes liegt, den Du gepostet hast. Vielleicht bei der Ausgabe des Ergebnisses?

  • Moin,

    ich habe es eben nochmal ausgetestet. Nun funktioniert es mit den Funktionen, mit denen es vor paar Tagen nicht funktioniert hat. :huh:

    Ich bin verwirrt.

  • http://sandbox.onlinephpfunctions.com/code/b0bfeb012…9e691f37f9a112a

    Probiert es mit anderen PHP-Versionen aus, es kommen immer dieselben Ergebnisse.

    Dieses Verhalten von round wird auch so in der Doku beschrieben: https://www.php.net/manual/de/function.round.php

    Bei wem das also out of the box funktioniert, verfügt scheinbar nicht über Standardeinstellungen.

    Die Empfehlung zur bc-Bibliothek oder number_format erscheint mir daher sinnvoller, wobei bcdiv die besten Ergebnisse liefert.

    Einmal editiert, zuletzt von Arne Drews (28. Juni 2020 um 11:17) aus folgendem Grund: Code im Link um sprintf erweitert

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!