rikudou / units
单位转换和计算器
Requires
- php: ^7.4
- ext-bcmath: *
- lisachenko/z-engine: ^0.8.1
Requires (Dev)
- friendsofphp/php-cs-fixer: ^3.1
- phpstan/phpstan: ^0.12.99
- phpunit/phpunit: ^9.5
This package is auto-updated.
Last update: 2024-09-19 23:24:55 UTC
README
此库使用出色的lisachenko/z-engine允许在对象上进行数学运算,允许执行此类操作
<?php use Rikudou\Units\Unit\Length\Meter; use Rikudou\Units\Unit\Length\Foot; $meter = new Meter(5); $feet = new Foot(15); $result = $meter + $feet; var_dump($result->getValue()); // dumps object of Rikudou\Units\Number\BigNumber which holds the value 9.572
您需要启用ffi并安装bcmath扩展。
单位始终是操作中第一个单位,这意味着如果您想要以英尺为单位的结果,只需将它们颠倒(或转换,下面将详细介绍)
<?php use Rikudou\Units\Unit\Length\Meter; use Rikudou\Units\Unit\Length\Foot; $meter = new Meter(5); $feet = new Foot(15); $result = $feet + $meter; var_dump($result->getValue()); // dumps object of Rikudou\Units\Number\BigNumber which holds the value 31.40419947506561
值始终是Rikudou\Units\Number\BigNumber
的实例,可以转换为int、float、bool和string。使用大数进行int和float转换可能不安全。
<?php use Rikudou\Units\Unit\Length\Meter; use Rikudou\Units\Number\BigNumber; $meter = new Meter(5); $value = $meter->getValue(); var_dump((int) $value); // int(5) var_dump((float) $value); // float(5) var_dump((string) $value); // string(1) "5" var_dump((bool) $value); // bool(true) $veryBigValue = $meter * PHP_INT_MAX; $value = $veryBigValue->getValue(); var_dump((string) $value); // on 64 bit correctly prints string(20) "46116860184273879035" var_dump((int) $value); // prints int(9223372036854775807) which is the value of PHP_INT_MAX on 64 bits var_dump((float) $value); // prints float(4.6116860184274E+19) which is more or less correct but not very precise // BigNumbers follow standard bool logic $number = new BigNumber(0); var_dump((bool) $number); // bool(false)
BigNumber
允许与其他BigNumber
、int、float、string以及实现__toString()
方法的对象进行标准数学运算。运算始终返回一个BigNumber
的新实例。
<?php use Rikudou\Units\Number\BigNumber; $number = new BigNumber(10); var_dump($number + $number); // BigNumber with value 20 var_dump($number + 10); // BigNumber with value 20 var_dump($number + 10.5); // BigNumber with value 20.5 var_dump($number + '10'); // BigNumber with value 20 $stringableObject = new class { public function __toString(): string { return '10'; } }; var_dump($number + $stringableObject); // BigNumber with value 20
在BigNumber
上支持以下标准数学运算
- 加法
- 减法
- 乘法
- 除法
- 幂运算
安装
composer require rikudou/units
单位运算
同一类型的所有项都可以自由相加和相减。此外,所有单位都可以添加、减去、乘以和除以数字(BigNumber、string、int、float、可转换为string的对象)。某些单位还可以在有意义的情况下乘以和除以其他单位(例如,长度单位相乘产生面积单位,面积单位除以长度单位产生长度单位)。不支持在无意义的不相关单位之间(如长度和面积)进行加法。
<?php use Rikudou\Units\Unit\Length\Meter; use Rikudou\Units\Unit\Length\Centimeter; $meter = new Meter(1); $centimeter = new Centimeter(10); var_dump($meter + $centimeter); // 1.1 meters var_dump($meter - $centimeter); // 0.9 meters var_dump($meter * $centimeter); // 0.1 square meters var_dump($meter / $centimeter); // error var_dump($meter * 2); // 2 meters var_dump($meter / 2); // 0.5 meters var_dump($meter ** 2); // 1 square meter var_dump($meter ** 3); // 1 cubic meter var_dump($meter ** 4); // error $squareMeter = $meter ** 2; var_dump($squareMeter / $meter); // 1 meter var_dump($squareMeter * $meter); // 1 cubic meter var_dump($squareMeter * $squareMeter); // error var_dump($squareMeter / $squareMeter); // error $cubicMeter = $meter ** 3; var_dump($cubicMeter / $squareMeter); // 1 meter var_dump($cubicMeter / $meter); // 1 square meter
您还可以自由地使用来自不同系统的单位
<?php use Rikudou\Units\Unit\Length\Meter; use Rikudou\Units\Unit\Length\Yard; $meter = new Meter(1); $yard = new Yard(1); var_dump($meter + $yard); // 1.9144 meters var_dump($meter - $yard); // 0.0856 meters var_dump($meter * $yard); // 0.9144 square meters var_dump($yard + $meter); // 2.0936132983377 yards
运算顺序很重要,因为第一个单位是结果将被转换成的单位。如果您想将结果转换为不同的单位,可以使用UnitConverter
对象
<?php use Rikudou\Units\Converter\UnitConverter; use Rikudou\Units\Unit\Length\Foot; use Rikudou\Units\Unit\Length\Yard; use Rikudou\Units\Unit\Length\Meter; use Rikudou\Units\Unit\Temperature\Celsius; use Rikudou\Units\Unit\Temperature\Fahrenheit; $converter = new UnitConverter(); $yards = new Yard(10); $feet = new Foot(10); $result = $yards + $feet; $meters = $converter->convert($result, Meter::class); var_dump($meters); // 12.19199999999999 meters $celsius = new Celsius(100); var_dump($converter->convert($celsius, Fahrenheit::class)); // 212 fahrenheits
支持的单位
长度
- 毫米
- 厘米
- 米
- 千米
- 英寸
- 英尺
- 码
- 英里
面积
- 平方毫米
- 平方厘米
- 平方米
- 平方公里
- 平方英尺
- 英亩
体积
- 立方毫米
- 立方厘米
- 立方米
- 立方千米
- 立方英尺
- 升
- 毫升
- 厘升
- 分升
温度
- 摄氏度
- 华氏度
- 开尔文
如果您想支持其他单位,请创建问题。
比较
您可以比较相关单位
<?php use Rikudou\Units\Unit\Length\Meter; use Rikudou\Units\Unit\Length\Centimeter; use Rikudou\Units\Unit\Temperature\Celsius; use Rikudou\Units\Unit\Temperature\Fahrenheit; $meter = new Meter(1); $centimeters = new Centimeter(100); var_dump($meter > $centimeters); // false var_dump($meter < $centimeters); // false var_dump($meter == $centimeters); // true var_dump($meter >= $centimeters); // true var_dump($meter <= $centimeters); // true $celsius = new Celsius(100); $fahrenheit = new Fahrenheit(100); var_dump($celsius > $fahrenheit); // true
相同的操作也适用于BigNumber
<?php use Rikudou\Units\Number\BigNumber; $number = new BigNumber(5); var_dump($number > 4); // true var_dump($number > 6); // false var_dump($number > 4.5); // true var_dump($number > '4'); // true var_dump($number > new BigNumber(3)); // true
字符串转换
当单位被转换为字符串时,会打印值和单位
<?php use Rikudou\Units\Unit\Length\Meter; use Rikudou\Units\Unit\Length\Inch; use Rikudou\Units\Unit\Length\Foot; $meters = new Meter(5); $metersSquared = $meters ** 2; $metersCubic = $meters ** 3; $inches = new Inch(5); $feet = new Foot(3.5); var_dump((string) $meters); // string(3) "5 m" var_dump((string) $metersSquared); // string(6) "25 m²" var_dump((string) $metersCubic); // string(7) "125 m³" var_dump((string) $inches); // string(4) "5″" var_dump((string) $feet); // string(8) "3′6″"
如你所见,英尺有一个特殊的转换,其中小数被转换为英寸。