madebybob / php-number
正确处理数字
Requires
- php: ^7.4|^8.0
- ext-bcmath: *
- ext-json: *
Requires (Dev)
- friendsofphp/php-cs-fixer: ^3.0
- phpro/grumphp: ^1.0
- phpunit/phpunit: ^9.3
- symfony/var-dumper: ^5.1
- vimeo/psalm: ^4.0
README
此库旨在在PHP中以正确的方式处理数字,如价格、重量和数量。
问题
您是否在PHP中处理过价格、重量或其他数字?它们的类型是什么?整数?字符串?还是您得到了一个浮点数来处理小数?您如何进行计算?我们都曾与浮点数的 反直觉行为 做斗争。
经过数小时的调查,您发现了 BC Math。现在您可以使用数字进行数学计算。然而,在代码库中管理这些数字仍然很困难。BC Math只接受和返回字符串。作为一个现代PHP开发者,在处理数字时类型提示字符串并不是一件好事。
解决方案
此库将帮助您在代码库中管理数字。使用Number
类,您可以类型提示它们(getTotal(Number $quantity)
)并在数字本身上执行计算($number->sum('200')
)。由于这些方法是不可变的,因此您可以在它们上链式调用方法。
范围
此库旨在使您的代码更干净。您可以类型提示Number
类,并且可以执行更干净的计算(仍然在后台使用BC Math)。
我们没有选择支持特定数字实现,如货币和重量。这太具体了,超出了范围。主要,数字的定制实现是业务特定的。我们认为您应该根据自己业务的需求自行创建它们。
目录
安装
您可以通过composer安装此包
composer require madebybob/php-number
用法
简而言之,Number\Number
类是所有关于的地方。这是创建Number
实例的方法
use Number\Number; // with string $number = new Number('200'); // with integer $number = new Number(200); // with float $number = new Number(200.8); // via static method $quantity = Number::create(4); // calculations $total = $number->add($quantity);
创建新数字(或在下述方法中使用它们)支持类型如Number
、字符串、整数和浮点数。
添加
要将新数字添加到当前数字实例中
$total = $number ->add('200') ->plus('200');
减去
要从当前数字实例中减去一个数字
$total = $number ->subtract('200') ->sub('200') // sub is an alias for subtract ->minus('200'); // minus is an alias for subtract
除以
要将当前数字实例除以给定的数字
$total = $number ->divide('200') ->div('200'); // div is an alias for divide
当然,除以零是不可能的。为了避免破坏链式调用,可以使用回退值,如下所示
$total = $number->divide($variable, null, '1.000');
乘以
要将当前数字实例乘以给定的数字
$total = $number ->multiply('200') ->mul('200'); // mul is an alias for multiply
求模
要获取当前数字实例的模数
$newNumber = $number ->modulus('200') ->mod('200'); // mod is an alias for modulus
平方根
要获取当前数字实例的平方根
$sqrt = $number ->sqrt() ->squareRoot(); // squareRoot is an alias for sqrt
状态 & 比较
要比较两个数字,以下助手可用,它们将返回一个bool
$number = new Number('200'); // check if the number is equal to x $number->isEqual('200'); $number->eq('200'); // check if the number is positive $number->isPositive(); // check if the number is negative $number->isNegative(); // check if the number is greater than x $number->isGreaterThan('100'); $number->gt('100'); // check if the number is greater than or equal to x $number->isGreaterThanOrEqual('100'); $number->gte('100'); // check if the number is less than x $number->isLessThan('300'); $number->lt('300'); // check if the number is less than or equal to x $number->isLessThanOrEqual('300'); $number->lte('300'); // check if the number is zero ("0") $number->isZero();
绝对值 & 相反数
要获取当前实例的绝对值(正值)
$number = new Number('-200'); // $absolute will be 200 $absolute = $number->absolute(); // abs is an alias for absolute $abs = $number->abs();
要获取当前实例的相反值
$number = new Number('200'); // $absolute will be -200 $absolute = $number->opposite(); // opp is an alias for absolute $abs = $number->opp();
限制值
要确保当前数字不是高于或低于预期的值
$number = new Number('200'); // $result will be 250 $result = $number->min('250'); // $result will be 100 $result = $number->max('100');
要同时使用最小和最大“夹具”
$number = new Number('200'); // $result will be 150 $result = $number->clamp('100', '150');
四舍五入
要四舍五入当前数字实例,以下方法可用
$number = new Number('200.5000'); // rounds the number to '201.0000' $number->round(); // ceils the number to '201.0000' $number->ceil(); // floors the number to '200.0000' $number->floor();
不可变 & 链式调用
由于Number
类是不可变的,大多数方法将返回一个新的Number
实例。
$two = new Number(2); $four = $two->plus(2); echo $two->toString(); // $two is still 2
由于数学方法是流畅的,您将能够这样链式调用您的计算
$number = new Number('200'); $result = $number ->add(200) ->subtract(109.5) ->mul($two) ->toString();
可扩展性
我们鼓励您为特定用例创建 AbstractNumber
类的自定义实现。这使您能够更好地进行类型提示,了解期望哪种类型的数字以及它们的格式。
PHP Number - 示例 是一个专门展示如何实现自定义数字类型(如重量)的存储库。请查看此存储库以获取有关此包可扩展性的更多文档。
测试 & Php CS Fixer
composer test
./vendor/bin/php-cs-fixer fix
变更日志
请查看 变更日志 以获取有关最近更改的更多信息。
贡献
请查看 贡献指南 以获取详细信息。
支持者
致谢
许可
MIT 许可证(MIT)。请参阅 许可文件 以获取更多信息。