madebybob/php-number

2.2.3 2022-10-24 10:14 UTC

This package is auto-updated.

Last update: 2024-09-24 14:42:40 UTC


README

GitHub Workflow Status (branch) Latest Version on Packagist Total Downloads GitHub

PHP Number

此库旨在在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

变更日志

请查看 变更日志 以获取有关最近更改的更多信息。

贡献

请查看 贡献指南 以获取详细信息。

支持者

Stargazers repo roster for @madebybob/php-number

致谢

许可

MIT 许可证(MIT)。请参阅 许可文件 以获取更多信息。