happy-types/money-type

Money 库实现了包含金额和货币的同一对象的 Money 值对象。

v1.2.2 2018-07-29 07:06 UTC

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。