rikudou/units

单位转换和计算器

dev-master 2021-09-19 17:02 UTC

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″"

如你所见,英尺有一个特殊的转换,其中小数被转换为英寸。