rocket-internet / money-value-object
表示货币价值的值对象(使用货币的最小单位)
v1.0.0
2016-09-29 10:27 UTC
Requires
- php: ^5.4|^7.0
- ext-intl: *
This package is not auto-updated.
Last update: 2024-09-18 20:19:47 UTC
README
是sebastianbergmann/money的分支,该项目已被废弃。
安装
{
"require": {
"rocket-internet/money-value-object": "^1.0.*"
}
}
以下为原始的README
该项目已被废弃。它仅被打算用作PHPUnit功能等的示例,而不是用于生产环境。对此,我感到非常抱歉。请查看moneyphp/money。
货币
安装
如果您使用Composer来管理项目的依赖关系,只需在项目的composer.json
文件中添加对sebastian/money
的依赖即可。
以下是一个定义Money依赖关系的最小composer.json
文件示例
{
"require": {
"sebastian/money": "^1.6"
}
}
使用示例
创建一个Money对象并访问其货币值
use SebastianBergmann\Money\Currency; use SebastianBergmann\Money\Money; // Create Money object that represents 1 EUR $m = new Money(100, new Currency('EUR')); // Access the Money object's monetary value print $m->getAmount(); // Access the Money object's monetary value converted to its base units print $m->getConvertedAmount();
上面的代码将产生以下输出
100
1.00
从字符串值创建一个Money对象
use SebastianBergmann\Money\Currency; use SebastianBergmann\Money\Money; // Create Money object that represents 12.34 EUR $m = Money::fromString('12.34', new Currency('EUR')) // Access the Money object's monetary value print $m->getAmount();
上面的代码将产生以下输出
1234
使用特定货币的Money子类
use SebastianBergmann\Money\EUR; // Create Money object that represents 1 EUR $m = new EUR(100); // Access the Money object's monetary value print $m->getAmount();
上面的代码将产生以下输出
100
请注意,没有针对土耳其里拉的Money
子类,因为TRY
在PHP中不是一个有效的类名。
使用PHP内置的NumberFormatter格式化Money对象
use SebastianBergmann\Money\Currency; use SebastianBergmann\Money\Money; use SebastianBergmann\Money\IntlFormatter; // Create Money object that represents 1 EUR $m = new Money(100, new Currency('EUR')); // Format a Money object using PHP's built-in NumberFormatter (German locale) $f = new IntlFormatter('de_DE'); print $f->format($m);
上面的代码将产生以下输出
1,00 €
使用Money对象进行基本算术运算
use SebastianBergmann\Money\Currency; use SebastianBergmann\Money\Money; // Create two Money objects that represent 1 EUR and 2 EUR, respectively $a = new Money(100, new Currency('EUR')); $b = new Money(200, new Currency('EUR')); // Negate a Money object $c = $a->negate(); print $c->getAmount(); // Calculate the sum of two Money objects $c = $a->add($b); print $c->getAmount(); // Calculate the difference of two Money objects $c = $b->subtract($a); print $c->getAmount(); // Multiply a Money object with a factor $c = $a->multiply(2); print $c->getAmount();
上面的代码将产生以下输出
-100
300
100
200
比较Money对象
use SebastianBergmann\Money\Currency; use SebastianBergmann\Money\Money; // Create two Money objects that represent 1 EUR and 2 EUR, respectively $a = new Money(100, new Currency('EUR')); $b = new Money(200, new Currency('EUR')); var_dump($a->lessThan($b)); var_dump($a->greaterThan($b)); var_dump($b->lessThan($a)); var_dump($b->greaterThan($a)); var_dump($a->compareTo($b)); var_dump($a->compareTo($a)); var_dump($b->compareTo($a));
上面的代码将产生以下输出
bool(true)
bool(false)
bool(false)
bool(true)
int(-1)
int(0)
int(1)
如果认为一个Money
对象的价值分别小于、等于或大于另一个Money
对象的价值,则compareTo()
方法返回一个小于、等于或大于零的整数。
您可以使用compareTo()
方法结合PHP内置的排序函数对一组Money
对象进行排序
use SebastianBergmann\Money\Currency; use SebastianBergmann\Money\Money; $m = array( new Money(300, new Currency('EUR')), new Money(100, new Currency('EUR')), new Money(200, new Currency('EUR')) ); usort( $m, function ($a, $b) { return $a->compareTo($b); } ); foreach ($m as $_m) { print $_m->getAmount() . "\n"; }
上面的代码将产生以下输出
100
200
300
将Money对象表示的货币值分配给N个目标
use SebastianBergmann\Money\Currency; use SebastianBergmann\Money\Money; // Create a Money object that represents 0,99 EUR $a = new Money(99, new Currency('EUR')); foreach ($a->allocateToTargets(10) as $t) { print $t->getAmount() . "\n"; }
上面的代码将产生以下输出
10
10
10
10
10
10
10
10
10
9
使用比例列表将Money对象表示的货币值进行分配
use SebastianBergmann\Money\Currency; use SebastianBergmann\Money\Money; // Create a Money object that represents 0,05 EUR $a = new Money(5, new Currency('EUR')); foreach ($a->allocateByRatios(array(3, 7)) as $t) { print $t->getAmount() . "\n"; }
上面的代码将产生以下输出
2
3
从Money对象表示的货币值中提取百分比(以及子总账)
use SebastianBergmann\Money\Currency; use SebastianBergmann\Money\Money; // Create a Money object that represents 100,00 EUR $original = new Money(10000, new Currency('EUR')); // Extract 21% (and the corresponding subtotal) $extract = $original->extractPercentage(21); printf( "%d = %d + %d\n", $original->getAmount(), $extract['subtotal']->getAmount(), $extract['percentage']->getAmount() );
上面的代码将产生以下输出
10000 = 8265 + 1735
请注意,这将从已包含百分比的货币值中提取百分比。如果您想获取货币值的百分比,应使用乘法(例如,使用multiply(0.21)
计算一个Money对象表示的货币值的21%)。