php-resource



Zurück   PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr > Entwicklung > PHP Developer Forum
 

Login

 
eingeloggt bleiben
star Jetzt registrieren   star Passwort vergessen
 

 

 


PHP Developer Forum Hier habt ihr die Möglichkeit, eure Skriptprobleme mit anderen Anwendern zu diskutieren. Seid so fair und beantwortet auch Fragen von anderen Anwendern. Dieses Forum ist sowohl für ANFÄNGER als auch für PHP-Profis! Fragen zu Laravel, YII oder anderen PHP-Frameworks.

Antwort
 
LinkBack Themen-Optionen Thema bewerten
  #1 (permalink)  
Alt 09-10-2015, 14:55
Koda
 Registrierter Benutzer
Links : Onlinestatus : Koda ist offline
Registriert seit: Aug 2010
Beiträge: 105
Koda befindet sich auf einem aufstrebenden Ast
Standard 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

Geändert von Koda (09-10-2015 um 15:20 Uhr)
Mit Zitat antworten
  #2 (permalink)  
Alt 09-10-2015, 16:26
SysOp
 Registrierter Benutzer
Links : Onlinestatus : SysOp ist offline
Registriert seit: May 2005
Beiträge: 68
SysOp befindet sich auf einem aufstrebenden Ast
Standard

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"); 
Mit Zitat antworten
  #3 (permalink)  
Alt 09-10-2015, 16:42
Koda
 Registrierter Benutzer
Links : Onlinestatus : Koda ist offline
Registriert seit: Aug 2010
Beiträge: 105
Koda befindet sich auf einem aufstrebenden Ast
Standard

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
Mit Zitat antworten
  #4 (permalink)  
Alt 10-10-2015, 07:31
Benutzerbild von mermshaus mermshaus
 Registrierter Benutzer
Links : Onlinestatus : mermshaus ist offline
Registriert seit: Jun 2009
Beiträge: 451
mermshaus wird schon bald berühmt werden
Standard

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
Mit Zitat antworten
  #5 (permalink)  
Alt 11-10-2015, 10:50
Koda
 Registrierter Benutzer
Links : Onlinestatus : Koda ist offline
Registriert seit: Aug 2010
Beiträge: 105
Koda befindet sich auf einem aufstrebenden Ast
Standard

Hi

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

Gruss

Oliver
Mit Zitat antworten
  #6 (permalink)  
Alt 12-10-2015, 14:44
SysOp
 Registrierter Benutzer
Links : Onlinestatus : SysOp ist offline
Registriert seit: May 2005
Beiträge: 68
SysOp befindet sich auf einem aufstrebenden Ast
Standard

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>'
Mit Zitat antworten
  #7 (permalink)  
Alt 13-10-2015, 17:21
Koda
 Registrierter Benutzer
Links : Onlinestatus : Koda ist offline
Registriert seit: Aug 2010
Beiträge: 105
Koda befindet sich auf einem aufstrebenden Ast
Standard

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
Mit Zitat antworten
  #8 (permalink)  
Alt 13-10-2015, 18:16
SysOp
 Registrierter Benutzer
Links : Onlinestatus : SysOp ist offline
Registriert seit: May 2005
Beiträge: 68
SysOp befindet sich auf einem aufstrebenden Ast
Standard

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
Mit Zitat antworten
  #9 (permalink)  
Alt 13-10-2015, 19:10
Koda
 Registrierter Benutzer
Links : Onlinestatus : Koda ist offline
Registriert seit: Aug 2010
Beiträge: 105
Koda befindet sich auf einem aufstrebenden Ast
Standard

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
Mit Zitat antworten
  #10 (permalink)  
Alt 13-10-2015, 19:41
Benutzerbild von mermshaus mermshaus
 Registrierter Benutzer
Links : Onlinestatus : mermshaus ist offline
Registriert seit: Jun 2009
Beiträge: 451
mermshaus wird schon bald berühmt werden
Standard

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.

Geändert von mermshaus (13-10-2015 um 19:46 Uhr)
Mit Zitat antworten
  #11 (permalink)  
Alt 14-10-2015, 12:23
SysOp
 Registrierter Benutzer
Links : Onlinestatus : SysOp ist offline
Registriert seit: May 2005
Beiträge: 68
SysOp befindet sich auf einem aufstrebenden Ast
Standard

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.
Mit Zitat antworten
  #12 (permalink)  
Alt 14-10-2015, 12:45
Koda
 Registrierter Benutzer
Links : Onlinestatus : Koda ist offline
Registriert seit: Aug 2010
Beiträge: 105
Koda befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
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
Mit Zitat antworten
  #13 (permalink)  
Alt 14-10-2015, 13:55
SysOp
 Registrierter Benutzer
Links : Onlinestatus : SysOp ist offline
Registriert seit: May 2005
Beiträge: 68
SysOp befindet sich auf einem aufstrebenden Ast
Standard

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.
Mit Zitat antworten
  #14 (permalink)  
Alt 14-10-2015, 14:24
Koda
 Registrierter Benutzer
Links : Onlinestatus : Koda ist offline
Registriert seit: Aug 2010
Beiträge: 105
Koda befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
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
Mit Zitat antworten
  #15 (permalink)  
Alt 14-10-2015, 17:11
Benutzerbild von mermshaus mermshaus
 Registrierter Benutzer
Links : Onlinestatus : mermshaus ist offline
Registriert seit: Jun 2009
Beiträge: 451
mermshaus wird schon bald berühmt werden
Standard

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).

Geändert von mermshaus (14-10-2015 um 18:25 Uhr)
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Preis in 2 Währungen lichtscheu PHP Developer Forum 6 30-03-2007 12:05
worddokumente mit Platzhalter holgi1 Apps und PHP Script Gesuche 9 16-01-2004 22:41
dateinamen mit platzhalter crisdoe PHP Developer Forum 3 05-12-2003 20:41
Between mit Platzhalter djnd SQL / Datenbanken 4 14-11-2003 15:08
runden mit JS andik2000 HTML, JavaScript, AJAX, jQuery, CSS, Bootstrap, LESS 4 20-05-2003 12:04

Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an


PHP News

ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlicht
ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlichtDie bekannte Marktplatzsoftware ebiz-trader ist in der Version 7.5.0 veröffentlicht worden.

28.05.2018 | Berni

Wissensbestand in Unternehmen
Wissensbestand in UnternehmenLebenslanges Lernen und Weiterbilden sichert Wissensbestand in Unternehmen

25.05.2018 | Berni


 

Aktuelle PHP Scripte

ADSMAN V3 - Werbe-Manager ansehen ADSMAN V3 - Werbe-Manager

ADSMAN V3 - mehr als nur ein Bannermanager! Banner, Textanzeigen und PagePeel Manager! Mit ADSMAN PRO haben Sie die Marketinglösung für eine effektive und effiziente Werbeschaltung mit messbaren Ergebnissen. Unterstützt werden Bannerformate in beliebi

25.10.2018 virtualsystem | Kategorie: PHP/ Bannerverwaltung
PHP News und Artikel Script V2

News schreiben, verwalten, veröffentlichen. Dies ist jetzt mit dem neuen PHP News & Artikel System von virtualsystem.de noch einfacher. Die integrierte Multi-User-Funktion und der WYSIWYG-Editor (MS-Office ähnliche Bedienung) ermöglichen...

25.10.2018 virtualsystem | Kategorie: PHP/ News
Top-Side Guestbook

Gästebuch auf Textbasis (kein MySQL nötig) mit Smilies, Ip Sperre (Zeit selbst einstellbar), Spamschutz, Captcha (Code-Eingabe), BB-Code, Hitcounter, Löschfunktion, Editierfunktion, Kommentarfunktion, Kürzung langer Wörter, Seiten- bzw. Blätterfunktion, V

22.10.2018 webmaster10 | Kategorie: PHP/ Gaestebuch
 Alle PHP Scripte anzeigen

Alle Zeitangaben in WEZ +2. Es ist jetzt 01:22 Uhr.