moneyphp/money

PHP 实现Fowler的Money模式

安装量: 52,387,551

依赖者: 422

建议者: 17

安全: 0

星标: 4,601

关注者: 91

分支: 440

开放问题: 8

v4.5.0 2024-02-15 19:47 UTC

README

Latest Version GitHub Workflow Status Total Downloads

Email

Money PHP

PHP库,使金钱操作更安全、更简单、更有趣!

"如果我每看到一个人使用FLOAT存储货币,我就有999.997634美元。" -- Bill Karwin

简而言之:你不应该用浮点数表示货币值。无论何时需要表示金钱,都应使用此Money值对象。从3.0版本开始,此库使用字符串内部来支持无限整数。

<?php

use Money\Money;

$fiveEur = Money::EUR(500);
$tenEur = $fiveEur->add($fiveEur);

list($part1, $part2, $part3) = $tenEur->allocate([1, 1, 1]);
assert($part1->equals(Money::EUR(334)));
assert($part2->equals(Money::EUR(333)));
assert($part3->equals(Money::EUR(333)));

文档可在http://moneyphp.org找到

需求

此库需要BCMath PHP扩展。对于特定功能,可能还有其他依赖项,例如,交换实现,请查阅文档获取更多信息。

版本4需要PHP 8.0。对于PHP的旧版本,请使用此库的版本3。从4.5版本开始,此包将只支持PHP自身实际接收更新的版本。如果您想使用旧版本的PHP,当然可以使用此包的旧版本。

安装

通过Composer

$ composer require moneyphp/money

功能

  • JSON序列化
  • 大整数支持,根据可用性使用不同的透明计算逻辑(bcmath、gmp、纯PHP)
  • 金钱格式化(包括intl格式化器)
  • 货币存储库(包括ISO货币)
  • 货币兑换(包括Swap实现)

文档

请参阅官方文档

测试

我们尝试使用phpunit遵循TDD来测试此库。

$ composer test

在Docker中运行测试

Money需要一系列依赖项,因此您可能想在Docker中运行它。

首先,在本地构建镜像

$ docker build -t moneyphp .

然后运行测试

$ docker run --rm -it -v $PWD:/app -w /app moneyphp vendor/bin/phpunit --exclude-group segmentation

贡献

我们非常希望看到您帮助我们使此库越来越好。请注意,我们不在类名中使用后缀和前缀,所以不是CurrenciesInterface,而是Currencies。除此之外,Style CI将帮助您使用与我们相同的代码风格。请提供创建PR时的测试,并在提交问题时提供清晰的错误描述。

安全

如果您发现任何与安全相关的问题,请通过[email protected]联系我们。

许可

MIT许可证(MIT)。有关更多信息,请参阅许可文件

致谢

此库在很大程度上受到Martin Fowler的Money模式的启发。特别感谢Mathias Verraes,没有他的贡献(包括代码和他的博客),此库不会处于现在的位置。