sgiphp / money

一个用于存储不同货币的类库

dev-master 2015-03-12 13:10 UTC

This package is not auto-updated.

Last update: 2024-09-14 17:04:48 UTC


README

此类(类)的目的是简化PHP中金钱的处理。您将能够执行类似以下操作

<?php
$exManager = ExchangeManager::getInstance();
$exManager->add("BGN/EUR 0.5113");

echo $exManager->exchange("100 BGN", "EUR"); // "51.13 EUR"

$someEur = new Money(51.13, "EUR");

echo $someEur->exchangeTo("BGN"); // "100.00 BGN"

那么,我们从

货币类

存在几种预定义的货币,这些实际上是所有定义为ISO标准的“真实”货币。要使用这些货币,您只需在构造函数中传递它们的3字符ISO 4217代码即可。

<?php
$usd = new Currency("USD");

当然,您可以定义自己的货币或通过提供代码和精度来覆盖默认货币。您可以想象精度就像货币中有多少小单位(分)一样,将在Money类中进一步介绍。

<?php
$bitcoin = new Currency("BTC", 10);
$fulldollar = new Currency("USD", 0); // default USD are with precision of 2 (the cents in 1 dollar)

// following will raise an UnknownCurrencyException, because LTC is not
// in the ISO standard and Currency class doesn't know the precision of the LTC
$litecoin = new Currency("LTC");
// so instead you MUST specify the precision. It's up to you what precision your application will use
$litecoin = new Currency("LTC", 8);

仅使用Currency类本身可以做的并不多,所以让我们转到

金钱类

您可以通过多种方式创建金钱

<?php
$price = new Money(99.99, new Currency("USD"));
$price = new Money(99.99, "USD");
$price = new Money("99.99 USD");

它们之间没有区别。但是,如果您想创建自己的货币或覆盖现有的某些货币,您必须首先使用第一种形式或实例化将失败并引发UnknownCurrencyException

<?php
$bitcoins = new Money(0.000123, new Currency("BTC", 10));
$bitcoins->getAmount(); // 0.000123
echo $bitcoins; // will output 0.0001230000 BTC

精度

现在关于在货币中定义的精度

<?php
$price = new Money(123.45678901, new Currency("USD"));
$price->getAmount(); // 123.46
echo $price; // will output "123.46 USD"

这是由于默认USD货币中定义的精度。请注意,第二个十进制数字不是5,而是6,因为四舍五入。

但如果你想要更多或少于十进制数字,你可以这样操作

<?php
$usd = new Currency("USD", 0);
$price = new Money(123.45678901, $usd);
$price->getAmount(); // 123
echo $price; // will output "123 USD"

$price = new Money(123.45678901, new Currency("USD", 5));
$price->getAmount() // 123.45679
echo $price; // will output "123.45679 USD"

比较

目前只有一个方法可以比较金钱

<?php
$usd = new Money("100 USD");
$usd->isEqualTo(new Money("100 BGN")); // FALSE
$usd->isEqualTo(new Money("99.99 USD")); // FALSE
$usd->isEqualTo(new Money("100.00 USD")); // TRUE
$usd->isEqualTo(new Money("100.001 USD")); // also returns TRUE due to the precision of the currency

转换(兑换)

您可以使用Money::exchange()方法将金钱从一种货币兑换为另一种货币。请耐心阅读以下内容以了解如何操作。(我必须先完成readme))... @todo

汇率类

为了能够从一种货币转换为另一种货币,您必须指定这些货币的汇率。为此,您可以

<?php
$rate = new ExchangeRate(new Currency("EUR"), new Currency("USD"), 1.25);
// or
$rate = new ExchangeRate("EUR", "USD", 1.25);
// or even
$rate = new ExchangeRate("EUR/USD 1.25");

现在您可以从一种货币兑换到另一种货币

<?php
$eurXusd = new ExchangeRate("EUR/USD 1.25");
$usd = $eurXusd->exchange(100); // returns Money object
echo $usd; // 125.00 USD
// you can pass Money object
$hundredEur = new Money("100 EUR");
$usd = $eurXusd->exchange($hundredEur);
// back conversion
echo $eurXusd->exchange($usd); // 100 EUR

invert()方法用于交换货币和反转比率。新的比率可以通过getRate()方法检索,货币通过getSourceCurrency()getTargetCurrency()检索

<?php
$eurXusd = new ExchangeRate("EUR/USD 1.25");
echo $eurXusd->getSourceCurrency(); // EUR
$eurXusd->invert();
echo $eurXusd; // USD/EUR 0.8
echo $eurXusd->getSourceCurrency(); // USD