happy-types / money-type
Money 库实现了包含金额和货币的同一对象的 Money 值对象。
Requires
- php: >=5.2.0
This package is auto-updated.
Last update: 2024-09-21 00:59:46 UTC
README
此库添加了一个新的类型 Money,该类型抽象了一个真实货币对象。 Money 有一个 值 和一个 货币。没有 Money 对象,你必须将这些值存储在单独的变量中,如 $amount, $currency。没有货币对象很难产生好的 API 方法。
示例
function getPrice()
应该返回值还是对象?
function getPrice() { return array($price, $value); }
或者更好?
function getPrice() { return Money::create($price, $value); }
现在你可以对货币对象应用一些数学运算
getPrice()->add(Money::create('10.00', 'LTL'))
或者同时添加并转换为某种货币
$priceInUsd = getPrice()->add(Money::create('10.00', 'LTL'))->convertTo('USD')
或者多种货币?哇?
$sum = Money::create('10.00', 'LTL')->add(Money::create('5.00', 'USD')) echo $sum->asString(); // 24.0000 LTL
比较不同货币的货币?
Money::create('10.00', 'LTL')->compare(Money::create('100.00', 'RUB'));
要启用货币转换,你必须实现 MoneyConverter
接口并将其注册到 Money
使用: Money::setDefaultMoneyConverter()
可以在 /tests/MockedMoneyConverter.php
中找到 MoneyConverter
的实现示例
Money
类 Money 是一个值对象,这意味着所有操作都将创建新的 Money 实例,所有实例都是不可变的
此类用于系统中描述货币值。它是一个 {金额,货币} 元组。
方法 add()
、subtract()
、compare()
、isEqual()
将隐式地将指定的参数转换为适当的货币。
对于货币转换,你可以实现 MoneyConverter
接口并使用 Money::setDefaultMoneyConverter()
注册你的货币转换器
默认小数精度为 4 位
你可以比较两个具有相同精度的对象。所有操作将使用可用的操作数的最高精度。
使用 Money::create($amount = '', $currency = '', $precision = -1)
静态工厂创建 Money 实例。 不要直接使用构造函数!
金额必须是字符串类型,并且十进制分隔符必须是点(例如,“123.45”)。你不能指定 Money::create(123.45)
或 Money::create("123,45")
。只有 Money::create("123.45")
<- 字符串,以点分隔的数字
货币金额 必须是 字符串类型。数字 必须是 以点分隔的。例如,“123.45”而不是“123,45”(bc 限制)。你 不能 使用浮点数或整数类型。这是防御性限制,以确保你不会意外丢失精度。如果你想指定整数、浮点数或字符串,可以使用 Money::createUnsafe()
方法,但 不推荐。
使用 Money::undefined($currency = '', $precision = -1)
创建未知金额的值。它是 Money::create(false)
、Money::create(null)
或 Money::create('')
的语法糖
e.g. Money::create('') === Money::undefined();
Money::create('0.00') !== Money::undefined();
你可以使用方法 isDefined()
和 isUndefined()
检查 Money 对象是否具有定义的金额。
任何货币操作中的所有未定义值都是允许的,并将转换为零
注意:请记住,货币转换将累积计算错误,因此像这样的操作
a = Money::create('10.00', 'LTL')
b = a->convertTo('USD')->convertTo('LVL')->convertTo('LTL');
由于转换错误,将产生不等于先前值的结果。绝对误差为 +-0.0003
你可以使用 isEqualExact()
与较低的精度比较这些值
可变 Money
类 MutableMoney
此类与 Money 类相同,不同之处在于此类不是值对象,因此它不会创建新的实例,而是将操作应用于相同的实例。因此,add()
和 subtract()
方法将影响实例值。
使用此类进行大量值的密集计算
默认系统货币
从v1.1版本开始,您可以指定默认货币,该货币将被传递给所有新的Money对象作为默认货币,如果未指定。请参阅Money::setDefaultCurrency($defaultCurrency)
数据库
要在数据库中持久化此对象,请使用DECIMAL(12, 4)作为金额,以及CHAR(3) BINARY作为货币!
安装和使用
将这些行添加到您的composer.json
"require":
{
"happy-types/money-type" : "~1.1"
}
}
运行:composer update
将composer自动加载器插入您的项目:require_once(dirname(__FILE__).'/vendor/autoload.php');
示例是为位于项目根目录的index.php。