2013-02-21 6 views
0

Таким образом, у меня есть формула в виде строкиPHP вычислить формулу в строке

$comm = "(a x 5% - 2%)";

Я хочу, чтобы это было $comm = $a * 5/100 * (1-2/100);

Как я могу сделать это в PHP?

+3

Возможно, вам понадобится написать парсер. – Leri

ответ

2

Посмотрите на

http://www.phpclasses.org/package/2695-PHP-Safely-evaluate-mathematical-expressions.html

который может оценивать Math код

// instantiate a new EvalMath 
    $m = new EvalMath; 
    $m->suppress_errors = true; 
// set the value of x 
    $m->evaluate('x = 3'); 
    var_dump($m->evaluate('y = (x > 5)')); 

Найдено в: Process mathematical equations in php

+0

hi Duk Я получаю сообщение об ошибке 'Exception: Class 'EvalMath' not found' как я могу использовать этот класс – Kuttoozz

3

Чтобы сделать это правильно, надежно и безопасно, с нуля, вам необходимо будет выполнить:

  1. Лексический анализ, это включает в себя шаблон, соответствующий вход с лексем:

    (a x 5% - 2%) 
    

    бы стать чем-то вроде следующей цепочки лексем:

    openparen variable multiply integer percent minus integer percent closeparen 
    
  2. анализа синтаксиса, это связано с тем лексемы и определение отношений между ними, что-то вроде этого, сопоставление шаблонов жетонов:

    statement = operand operator statement 
    
  3. Затем вам нужно проанализировать результирующее синтаксическое дерево, чтобы вы могли запустить его и получить ответ.

Он никогда не будет выглядеть так просто, как $comm = $a * 5/100 - 2/100;, но это приведет к такому же выводу.

Кто-то где-то уже, вероятно, был пойти на эту проблему, вот два я нашел после непродолжительного поиска Google: PHP Maths Expression Parser, And another.

Эти вопросы SO похожи, а Smart design of a math parser?, Process mathematical equations in php

1

Он просто пытался, но, может быть, хорошее начало.

$somm = 0; 
$a = 30; 

$str = "(a x 5% - 2%)"; 

$pt1 = "/x/i"; 
$str = preg_replace($pt1, "*", $str); 

$pt2 = "/([a-z])+/i"; 
$str = preg_replace($pt2, "\$$0", $str); 

$pt3 = "/([0-9])+%/"; 
$str = preg_replace($pt3, "($0/100)", $str); 

$pt4 = "/%/"; 
$str = preg_replace($pt4, "", $str); 

$e = "\$comm = $str;"; 
eval($e); 
echo $e . "<br>"; 
echo $comm; 
0

Решенный!

<?php 
    function evalmath($equation) 
    { 
     $result = 0; 
     // sanitize imput 
     $equation = preg_replace("/[^a-z0-9+\-.*\/()%]/","",$equation); 
     // convert alphabet to $variabel 
     $equation = preg_replace("/([a-z])+/i", "\$$0", $equation); 
     // convert percentages to decimal 
     $equation = preg_replace("/([+-])([0-9]{1})(%)/","*(1\$1.0\$2)",$equation); 
     $equation = preg_replace("/([+-])([0-9]+)(%)/","*(1\$1.\$2)",$equation); 
     $equation = preg_replace("/([0-9]{1})(%)/",".0\$1",$equation); 
     $equation = preg_replace("/([0-9]+)(%)/",".\$1",$equation); 
     /*if ($equation != ""){ 
      $result = @eval("return " . $equation . ";"); 
     } 
     if ($result == null) { 
      throw new Exception("Unable to calculate equation"); 
     } 
     return $result;*/ 
     return $equation; 
    } 
    $total = 18000; 
    $equation = evalmath('total-(230000*5%-2%+3000*2*1)'); 
    if ($equation != ""){ 

     $result = @eval("return " . $equation . ";"); 
    } 
    if ($result == null) { 

     throw new Exception("Unable to calculate equation"); 
    } 
    echo $result; 
?>