Währungen mit Platzhalter runden

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Währungen mit Platzhalter runden

    Guten Tag

    Ich versuche gerade eine Lösung zu finden um verschiedene Währungen von einer Hauptwährung EUR zu berechnen und zu runden.

    Was ich bisher habe:
    Code:
    Tabelle währung:
    ID | waehrung | waehrungName | exchangeRate | decimals | decPoint | thousandsSep
    1 | EUR | Euro | 1.0000 | 2 | , | ''
    1 | CHF | Schweizer Franken | 0.9876 | 2 | . | '
    1 | ISK | Isländische Kronen | 102.12345 | 0 | '' | .
    Beschreibung:
    exchangeRate = Wechselkurs
    decimals = Nachkommastellen für die Funktion number_format
    decPoint = Kommatrennzeichen für die Funktion number_format
    thousandsSep = Tausendertrennzeichen für die Funktion number_format

    Das ist soweit kein Problem. Ich habe einen Preis in EUR, und rechne diesen Preis x exchangeRate.

    Nun suche ich aber eine Möglichkeit eine Spalte zu machen "runden" oder sowas.

    Gerne würde ich eine Funktion machen damit ich nicht immer etwas in der Art haben muss wie:
    PHP-Code:
    if($waehrung == 'EUR'//runde auf diese weise
    elseif($waehrung == 'CHF'//runde auf diese weise
    elseif($waehrung == 'ISK'//runde auf diese weise 
    Es ist ja so, dass EUR Preise 2 Nachkommastellen haben ohne das diese gerundet werden müssen da es den Betrag 99.99 gibt. Bei Schweizer Franken gibt es zwei Nachkommastellen aber es muss auf .05 gerundet werden da nur noch 5 Rappen Stücke als kleinste Wärhung verwendet werden.
    Bei ISK gibt es gar keine Nachkommastellen.
    Jede währung ist da anders. Mal sind es mehr oder weniger Nachkommastellen und mal muss gerundet werden und mal nicht.

    Hat da jemand eine Idee wie ich das sauber lösen könnte?

    Vielen Dank schon im Voraus für jede Hilfe.

    EDIT: Ich habe mir schon die Funktion money_format angeschaut erhalte aber immer das selbe Format. Ich weiss auch noch nicht ob das wirklich die Lösung sein könnte.

    Gruss

    Koda
    Zuletzt geändert von Koda; 09.10.2015, 14:20.

  • #2
    Für number_format hast du Einstellungen je Währung, was hindert dich, auch Werte für round anzulegen?
    Das Ergebis ist dann
    PHP-Code:
    number_format(round($ZAHL"DEINE_VORGABE"),"DEINE_EINSTELLUNGEN"); 

    Kommentar


    • #3
      Hi

      Vielen Dank. Nur bin ich nicht sicher wie ich das Automatisieren könnte. Vielleicht mache ich es auch einfach zu kompliziert.

      Diverse Tutorials um fürSchweizer Franken zu Runden sehen so aus:
      PHP-Code:
      round($preis 52) * 
      Nun könnt ich ja die 5 in die Datenbank schreiben. Aber wie sieht es denn aus wenn ich auf Cent genau runden möchte? Dann passt das mit der Division ja nicht oder?

      Gruss

      Koda

      Kommentar


      • #4
        Ich würde es als „Auflösung“ definieren im Kontext der Zielwährung und jeweils den kleinstmöglichen Wert angeben:

        EUR: 0.01
        ISK: 1.00
        CHF: 0.05

        (Anschaulich gesprochen: Das kleinste von deiner Anwendung gewünschte Geldstück der Währung.)

        Dann bildest du für einen Eingabe-Zahlenwert, der der Auflösung entsprechend formatiert werden soll, die nächstkleinere und nächstgrößere gültige Darstellung.

        PHP-Code:
        <?php

        function f($x$resolution)
        {
            
        $w floor($x $resolution) * $resolution;
            
        $y ceil($x $resolution) * $resolution;

            return array(
        $w$x$y);
        }

        var_dump(
            
        implode(', 'f(123.4560.01)),
            
        implode(', 'f(123.4561.00)),
            
        implode(', 'f(123.4560.05))
        );

        // string(23) "123.45, 123.456, 123.46"
        // string(17) "123, 123.456, 124"
        // string(22) "123.45, 123.456, 123.5"
        Und davon wählst du diejenige, die näher an der Eingabe liegt oder wie auch immer.

        PHP-Code:
        function g($x$resolution)
        {
            
        $w floor($x $resolution) * $resolution;
            
        $y ceil($x $resolution) * $resolution;

            return (
        $x $w $y $x) ? $w $y;
        }

        var_dump(
            
        g(123.4560.01),
            
        g(123.4561.00),
            
        g(123.4750.05)
        );

        // float(123.46)
        // float(123)
        // float(123.45) 
        Aufmerksame Leser stellen an der Stelle fest, dass die letzte Ausgabe (float(123.45)) eigentlich nicht richtig ist, weil die return-Zeile besagt, dass bei gleichem Abstand aufgerundet wird. Es müsste also float(123.5) sein. Woran liegt das? Die üblichen Ungenauigkeiten beim Rechnen mit Fließkommazahlen.

        Code:
        php > $x = 123.475; $resolution = 0.05;
        php > $w = floor($x / $resolution) * $resolution;
        php > $y = ceil($x / $resolution) * $resolution;
        php > var_dump($w, $y);
        float(123.45)
        float(123.5)
        php > var_dump($x - $w, $y - $x);
        float(0.024999999999991)
        float(0.025000000000006)
        Wie behebt man das? Nicht mit Fließkommazahlen rechnen.

        Eine Alternative ist die bc-Erweiterung, die leider nicht standardmäßig in PHP enthalten ist.

        - PHP: BC Math - Manual

        Kommentar


        • #5
          Hi

          Vielen Dank mermshaus. Einfach nur geil. So einfach und doch so effektiv

          Gruss

          Oliver

          Kommentar


          • #6
            Der Vollständigkeit halber, ich meine, dass man buchhalterisch erst das Ergebnis runden darf, schlage also z.B. sowas vor:

            Euro auf Währung;
            PHP-Code:
            function rechne($euro$in_waehrung$kurs$runden$format_nachkomma=2)
            {
                
            // Kurs berechenen
                
            $ergebnis $euro*$kurs;

                
            // genauigkeit
                
            $x round($ergebnis$runden);

                
            // formatiert
                
            $y number_format($ergebnis,$format_nachkomma,',','.');

                
            // das Ergebnis ausgeben
                
            $back['euro'] = $euro;
                
            $back[$in_waehrung]=$x;
                
            $back['formatiert'] = $y;

                return 
            $back;
            }

            // rechne(Euro, in welche Währung, Kurs, Genauigkeit zum rechnen, gerundeter Wert)
            $ergebnis rechne(1,'USD',1.13747,5,2);

            echo 
            '<pre>';
            print_r($ergebnis);
            echo 
            '</pre>'

            Kommentar


            • #7
              Hi

              Vielen Dank SysOp. Das habe ich noch gar nicht überlegt. Ich habe nun deine Funktion genommen und beim runden einfach das so eingebaut wie in der Funktion von mermshaus damit ich weiterhin die Rundung mit 0.01 oder 1.00 angeben kann:
              PHP-Code:
              $xround(($ergebnis $runden) * $runden2); 
              Stimmt das so überhaupt? Die ergebnisse stimmen eigentlich. Die 2 gibt ja nur die genauigkeit des Runden an oder?

              Ich erhalte auf jedenfall keinen Unterschied bei diesen beiden:
              PHP-Code:
              $xround(($ergebnis $runden) * $runden2); 
              und
              PHP-Code:
              $xround($ergebnis $runden) * $runden
              Kommt das aufs selbe an oder mache ich grad ein überlegungsfehler?

              Gruss

              Koda

              Kommentar


              • #8
                Ich bin nicht sicher, ob mermshaus seine Funktion nicht nur als Ausgabefunktion verstanden wissen will. Dann finde ich seine Lösung elegant.

                Der Unterschied zu meiner Funktion ist der, dass ich die Kursberechnung in der Funktion selbst habe, den neuen Wert berechne und das Ergebnis dann runde.
                Ausserdem unterscheide ich zwischen dem errechneten Wert mit frei definierbarer Nachkommastelle (also zu.B. 5) mit dem man dann weiterrechnen könnte) und der formatierten Ausgabe mit definierbaren Nachkommastellen (im Bsp. 2).

                Entscheidend wird sowas bei sehr kleinen Beträgen, die man weiter verwenden möchte.

                Ein sehr übetriebenes Bsp:
                1 Paket mit 1 Mio Stecknadeln kostst €2, was kostet ein Stk in Dollar und wie hoch ist die Ust? in Dollar.

                Ich weiss ja nicht, was du mit dem Umrechner weiter machen möchtest

                Kommentar


                • #9
                  Hi

                  Vielen Dank. Es geht um eine Plattform mit einer Grundwährung z.B. CHF oder auch EUR. Nun möchte ich die Plattform umstellen können auf z.B. USD.

                  Die Preise werden danach umgerechnet und angezeigt. Gerechnet wird damit dann in einer art Warenkorb berechnet. Dort sind dann die Preise aber bereits in einer Datenbank und müssen nicht mehr umgerechnet werden.

                  Deine Funktion gefällt mir da sehr gut. Nur sehe ich noch nicht wie ich am einfachsten angeben kann das der kleinste betrag 0.01, 0.05, 0.10 oder auch 1.00 ist. Daher meine Frage mit der round erweiterung ob das so passen könnte.

                  Gruss

                  Oliver

                  Kommentar


                  • #10
                    Ich habe nur versucht, die Frage so zu beantworten, wie ich sie verstanden habe. Mir ging es da nicht um kaufmännische Aspekte. Dass auch die Isländer und Schweizer nicht jeden Kleinstbetrag auf volle Rappen oder Kronen runden, sollte ja klar sein. Das ist ja auch beim Euro nicht anders, wenn man sich zum Beispiel mal Benzinpreise an Tankstellen ansieht, die manchmal auch mit Zehntel-Cent angegeben werden (jedenfalls früher).

                    Fürs kaufmännische Rechnen dürfte es durchaus Sinn ergeben oder gar notwendig sein, weitere Nachkommastellen zu verwalten. Da bin ich aber kein Experte. Ich habe hier eine andere Fragestellung beantwortet.
                    Zuletzt geändert von mermshaus; 13.10.2015, 18:46.

                    Kommentar


                    • #11
                      Bin eigentlich auch nur durch die Währung und Umrechnungskurse auf die Idee gekommen, als reine Ausgabefunktion in einer Webseite würde ich durchaus mermshaus Lösung bevorzugen.

                      Kommentar


                      • #12
                        Zitat von Koda Beitrag anzeigen
                        Ich erhalte auf jedenfall keinen Unterschied bei diesen beiden:
                        PHP-Code:
                        $xround(($ergebnis $runden) * $runden2); 
                        und
                        PHP-Code:
                        $xround($ergebnis $runden) * $runden
                        Kommt das aufs selbe an oder mache ich grad ein überlegungsfehler?
                        Ok vielen dank euch zwei. Kann mir noch jemand den Unterschied der beiden schreibweisen nennen? Ich erhalte wie gesagt die selben ergebnisse.

                        Ich möchte nachher die Währung mit dem kleinsten wert angeben können wie oben geschrieben (0.01, 0.05, 1.00).

                        Gruss

                        Koda

                        Kommentar


                        • #13
                          gar nicht so einfach.

                          PHP-Code:
                          ($ergebnis $runden) * $runden 
                          macht eigentlich keinen Sinn. Etwas durch 7 zu teilen und danach mit 7 zu multiplizieren ist eigentlich nicht sehr sinnvoll.
                          Variante 1: das ,2 gibt an, auf wieviele Stellen gerundet werden soll.


                          Noch einmal, mermshaus Lösung behebt deine Anfangsfrage sicher besser als meine, ich wollte nur vorsichtshalber auf den Kaufmännischen Aspekt hinweisen.

                          Kommentar


                          • #14
                            Zitat von SysOp Beitrag anzeigen
                            gar nicht so einfach.

                            PHP-Code:
                            ($ergebnis $runden) * $runden 
                            macht eigentlich keinen Sinn. Etwas durch 7 zu teilen und danach mit 7 zu multiplizieren ist eigentlich nicht sehr sinnvoll.
                            Variante 1: das ,2 gibt an, auf wieviele Stellen gerundet werden soll.


                            Noch einmal, mermshaus Lösung behebt deine Anfangsfrage sicher besser als meine, ich wollte nur vorsichtshalber auf den Kaufmännischen Aspekt hinweisen.
                            Vielen Dank. Das mit dem dividieren und dann multiplizieren gibt wenig sinn aber wenn du nach einer Lösung suchst auf 5 rappen zu runden findest du sehr oft genau diese funktion

                            Vielen Dank euch beiden

                            Gruss

                            Koda

                            Kommentar


                            • #15
                              Das findest du vermutlich für Sprachen, die Integer-Division kennen. Integer-Division bedeutet: Wenn zwei Integer durcheinander geteilt werden und das Ergebnis keinen Integer ergibt, dann wird der Rest verworfen, sodass es wieder einen Integer ergibt.

                              10 / 5 → 2 (Rest 0) → 2
                              14 / 5 → 2 (Rest 4) → 2

                              Das gibt es aber in PHP nicht. PHP liefert in dem Fall eine Fließkommazahl (14 / 5 → 2.8).

                              Der Operator für Integer-Division heißt auch manchmal div oder \ (umgekehrtes Geteilt-Zeichen).
                              Zuletzt geändert von mermshaus; 14.10.2015, 17:25.

                              Kommentar

                              Lädt...
                              X