Maßeinheiten

Geld, als allgemeines Tausch und Zahlungsmittel, gibt es in unterschiedlichen Formen und Ausprägungen. Die Währungs-Klassen aus dem Framework bieten für viele Vorgänge eine passende Lösung an. Insbesondere für die Berechnung von Preis pro Fläche oder pro pro Menge stehen Berechnungs- und Konvertierungsfunktionen bereit.

Währungen

Eine Währung ermöglicht den Transfer von Waren und Dienstleistungen, ohne eine Gegenleistung in Form von anderen Waren und Dienstleistungen zu liefern. Die Währungen stehen als Klassen zur Verfügung.

// Währungsobjekte holen
$USD=\Alvine\Measure\Economics\Currencies::getCurrency('USD');
$EUR=\Alvine\Measure\Economics\Currencies::getCurrency('EUR');

Währungen ausgeben

Währungen werden auch für die Ausgabe benötigt. Hierzu kann man mit dem Einheiten-Formatter die Währung als Einheit übergeben. Einige Währungen besitzen neben dem offiziellen Kürzel auch ein Währungszeichen. So steht das für den Euro und das $-Zeichen für den Dollar.

// Währungssymbole im Formatter setzen
\Alvine\Measure\Formatter\UnitFormatter::getDefaultFormatter()
    ->label($USD, \Alvine\I18n\Resource\CurrencySigns::getSign('USD'));

\Alvine\Measure\Formatter\UnitFormatter::getDefaultFormatter()
    ->label($EUR, \Alvine\I18n\Resource\CurrencySigns::getSign('EUR'));

Der Formatter für die Währungen besitzt drei Platzhalter: amount, unit und error. error ist der beim Runden oder berechnen entstandene Fehler. Der Formatter verwendet intern die PHP-Methode vsprintf. Das s hinter dem $-Zeichen im Format bedeutet laut PHP-Dokumentation: "s - das Argument wird als String angesehen und auch als solcher ausgegeben."

/** Formatter definieren */
\Alvine\Measure\Formatter\AmountFormatter::getDefaultFormatter()
    ->setFloatFormat('%amount$s %unit$s');

Rechnen mit Geldbeträgen

Währungsbeträge können über die Funktionen Money::times(), Money::divide(), Money::plus() und Money::minus() multipliziert, dividiert, addiert und subtrahiert werden. Über Money::root() und Money::pow() kann zudem die Quadratwurzel gezogen und der Exponent berechnet werden.

Diese Methode bieten im Gegensatz zur direkten Berechnung den sicheren Umgang mit Fehlern und Genauigkeit.

// Währungsobjekte holen
$EUR=\Alvine\Measure\Economics\Currencies::getCurrency('EUR');

/** Formatter definieren */
\Alvine\Measure\Formatter\AmountFormatter::getDefaultFormatter()->setFloatFormat('%amount$s %unit$s');

/** Ausgabe mit Sonderzeichen $ und € statt USD und EUR */
\Alvine\Measure\Formatter\UnitFormatter::getDefaultFormatter()->label($EUR, \Alvine\I18n\Resource\CurrencySigns::getSign('EUR'));


/** Geldbetrag */
$spending=\Alvine\Measure\Economics\Money::valueOf(5.56, $EUR);

/** Ausgabe */
echo((string) $spending."\n");
// Ausgabe -> 5.56 €

// Wert teilen
$spending=$spending->divide(10);
echo((string) $spending."\n");
// Ausgabe -> 0.56 €
// Wert multiplizieren

$spending=$spending->times(100);
echo((string) $spending."\n");
// Ausgabe -> 55.60 €
// Werte addieren

$spending=$spending->plus(\Alvine\Measure\Economics\Money::valueOf(65.56, $EUR));
echo((string) $spending."\n");
// Ausgabe -> 121.16 €

Umrechnung

// Währungsobjekte holen
$USD=\Alvine\Measure\Economics\Currencies::getCurrency('USD');
$EUR=\Alvine\Measure\Economics\Currencies::getCurrency('EUR');

/** Wechselkurs 8.5.2018 */
$rate=1.19340;

// Wechselkurs läuft immer über eine Referenzwährung
\Alvine\Measure\Economics\ReferenceCurrency::setCurrentReference($USD);
\Alvine\Measure\Economics\ReferenceCurrency::getCurrentReference()->setExchangeRate($EUR, $rate);

/** Geldbetrag */
$spending=\Alvine\Measure\Economics\Money::valueOf(5.56, $USD);

/** Wechseln */
$spendingInEur=$spending->to($EUR);

/** Formatter definieren */
\Alvine\Measure\Formatter\AmountFormatter::getDefaultFormatter()->setFloatFormat('%amount$s %unit$s');

/** Ausgabe mit Sonderzeichen $ und € statt USD und EUR */
\Alvine\Measure\Formatter\UnitFormatter::getDefaultFormatter()->label($USD, \Alvine\I18n\Resource\CurrencySigns::getSign('USD'));
\Alvine\Measure\Formatter\UnitFormatter::getDefaultFormatter()->label($EUR, \Alvine\I18n\Resource\CurrencySigns::getSign('EUR'));


/** Ausgabe */
echo("".$spending." ≙ ".$spendingInEur."");

// Ausgabe -> 5.56 USD ≙ 4.66 EUR

Beispiel

// Währungsobjekte holen
$USD=\Alvine\Measure\Economics\Currencies::getCurrency('USD');
$EUR=\Alvine\Measure\Economics\Currencies::getCurrency('EUR');

// Währungssymbole holen und setzen
\Alvine\Measure\Formatter\UnitFormatter::getDefaultFormatter()->label($USD, \Alvine\I18n\Resource\CurrencySigns::getSign('USD'));
\Alvine\Measure\Formatter\UnitFormatter::getDefaultFormatter()->label($EUR, \Alvine\I18n\Resource\CurrencySigns::getSign('EUR'));

// Wechselkurs läuft immer über eine Referenzwährung
\Alvine\Measure\Economics\ReferenceCurrency::setCurrentReference($USD);
\Alvine\Measure\Economics\ReferenceCurrency::getCurrentReference()->setExchangeRate($EUR, 1.17);

// Angabe des Verbrauchs in Meilen pro Galone (20 mi/gal)
$carMileage=\Alvine\Measure\Amount::valueOf(20, \Alvine\Measure\NonSI::mile()->divide(\Alvine\Measure\NonSI::gallonLiquidUS())); 
// Kosten des Benzins in Euro / Liter (1.2 €/L)
$gazPrice=\Alvine\Measure\Amount::valueOf(1.2, $EUR->divide(\Alvine\Measure\NonSI::liter())); 
// Gefahrene Distanz in Kilometern (400 km)
$tripDistance=\Alvine\Measure\Amount::valueOf(400, \Alvine\Measure\MetricPrefix::kilo(\Alvine\Measure\SI::meter())); 

// Kosten der Reise in Euro
$tripCostEUR=$tripDistance->divide($carMileage)->times($gazPrice)->to($EUR);
// Kosten in Dollar (Umrechung)
$tripCostUSD = $tripCostEUR->to($USD);

// Displays cost.
echo("Car Miles = $carMileage\n");
// -> Car Miles = 20 mi/gal
echo("Gas Prize = $gazPrice\n");
// -> Gas Prize = (1.20 ± 0.0) €/l
echo("Trip Distance = $tripDistance\n");
// -> Trip Distance = 400 (m)*1000
echo ("============================\n");
// -> ============================
echo("Trip cost = ".$tripCostEUR." (".$tripCostUSD.")\n");
// ->  Trip cost = (56.45 ± 0.0) € ((66.05 ± 0.0) $)

// Ausgabe ohne Fehler
\Alvine\Measure\Formatter\AmountFormatter::getDefaultFormatter()->setFloatFormat('%amount$s %unit$s');
echo("Trip cost = ".$tripCostEUR." (".$tripCostUSD.")");