fintara/calculator-php

算术表达式计算器

2.0.1 2022-04-13 17:07 UTC

This package is not auto-updated.

Last update: 2024-09-26 15:37:24 UTC


README

PHP算术表达式计算器

2+5.9       = 7.9
3.5^(2-5)   = 0.02332361516035
5-(2*(1+2)) = -1

默认包含的函数有 sqrt(x)log(base, arg),也可以添加任何参数数量的自定义函数。

基本用法

use \Fintara\Tools\Calculator\Calculator;

$calculator = Calculator::create(); // use default tokenizer
echo $calculator->calculate('1+2*3/4'); // 2.5

高级用法

自定义函数

您可以添加自定义函数

  • name: 函数名,将在表达式中使用。所有字符均为小写和 _ (下划线)。
  • implementation: 如何评估函数。
$calculator->addFunction('cbrt', function($x) {
    return pow($x, 1/3);
});

echo $calculator->calculate('cbrt(27)'); // 3

标记化器

您也可以使用标记化器(或提供自己的计算器)

$tokenizer = new Tokenizer();
$tokens = $tokenizer->tokenize('1+2*3.5'); // [1, '+', 2, '*', 3.5]

如果表达式包含函数(例如 sqrt(x)),标记化器需要知道所有函数的名称作为第二个参数。

$tokens = $tokenizer->tokenize('1+sqrt(4)', ['sqrt']); // [1, '+', 'sqrt', '(', 4, ')']

注意: 默认标记化器会在数字和后面的函数之间或数字和后面的括号之间自动添加 *(乘法)符号(如果找不到符号)。

$tokens = $tokenizer->tokenize('2 (1 + 3)'); // [2, '*', '(', 1, '+', 3, ')']

变更日志

2.0.1

  • 添加了 LICENSE

2.0.0

  • 重大变更:操作符 mod 重命名为 %
  • 重大变更:addFunction 不再需要参数数量(移除了第三个参数)。
  • 重大变更:添加具有现有名称的函数会引发错误。您可以使用辅助函数 replaceFunction
  • 重大变更:getReversePolishNotation 是私有的。
  • 重大变更:移除了 setExpression。直接使用 calculate($expression)
  • 重大变更:ILexerDefaultLexer 分别替换为 TokenizerInterfaceTokenizer