Saltar al contenido

calcular la expresión matemática de un string usando evaluación

Por fin después de mucho luchar ya dimos con la contestación de este atascamiento que agunos lectores de nuestra web han presentado. Si deseas aportar algo no dudes en aportar tu comentario.

Solución:

Si bien no sugiero usar eval por esto (es no la solución), el problema es que eval espera líneas completas de código, no solo fragmentos.

$ma ="2+10";
$p = eval('return '.$ma.';');
print $p;

Deberías hacer lo que quieras.


Una mejor solución sería escribir un tokenizador/analizador para su expresión matemática. Aquí hay uno muy simple basado en expresiones regulares para darle un ejemplo:

$ma = "2+10";

if(preg_match('/(d+)(?:s*)([+-*/])(?:s*)(d+)/', $ma, $matches) !== FALSE)
    $operator = $matches[2];

    switch($operator)
        case '+':
            $p = $matches[1] + $matches[3];
            break;
        case '-':
            $p = $matches[1] - $matches[3];
            break;
        case '*':
            $p = $matches[1] * $matches[3];
            break;
        case '/':
            $p = $matches[1] / $matches[3];
            break;
    

    echo $p;

Mira esto..

Lo uso en un sistema de contabilidad donde puede escribir expresiones matemáticas en campos de entrada de cantidad.

Ejemplos

$Cal = new Field_calculate();

$result = $Cal->calculate('5+7'); // 12
$result = $Cal->calculate('(5+9)*5'); // 70
$result = $Cal->calculate('(10.2+0.5*(2-0.4))*2+(2.1*4)'); // 30.4

Código

class Field_calculate 
    const PATTERN = '/(?:-?d+(?:.?d+)?[+-*/])+-?d+(?:.?d+)?/';

    const PARENTHESIS_DEPTH = 10;

    public function calculate($input) strpos($input, '-') != null 

    private function compute($input)
        $compute = create_function('', 'return '.$input.';');

        return 0 + $compute();
    

    private function callback($input)
        if(is_numeric($input[1]))
            return $input[1];
        
        elseif(preg_match(self::PATTERN, $input[1], $match))
            return $this->compute($match[0]);
        

        return 0;
    

Usar la función eval es muy peligroso cuando no puedes controlar el string argumento.

Pruebe Matex para el cálculo seguro de fórmulas matemáticas.

Más adelante puedes encontrar las acotaciones de otros usuarios, tú aún tienes la habilidad dejar el tuyo si lo deseas.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *