1 votes

Comment vérifier et exécuter une expression mathématique en utilisant Javascript

J'essaie de créer une fonction Javascript qui prendra une expression mathématique et l'appliquera à un nombre prédéfini, par exemple :

var myNum = 10;

function EQ(eq){
// code here 
}

Par exemple, l'entrée devrait ressembler à ceci :

EQ("*100/10"); //output 100
EQ("+100");    //output will be 110
EQ("-+=1");    //output false

Y a-t-il un moyen de le faire ? Merci

4voto

Jonathan Sampson Points 121800

Vous pourriez probablement travailler eval() en une solution simple. Par exemple :

var myNum = 10;

function EQ(eq) { return eval(myNum+eq); }

alert( EQ("*100/10") ); // outputs 100

Je vous encourage à aller plus loin en mettant en place une try-catch et le traitement des exceptions.

1voto

Matthew Points 25748

Voici un évaluateur d'expression simple :

function evalExpression(text)
{
  var tokens = text.split(" ");

  var output = [];
  var operators = [];

  var reNumber = /^\d+(\.\d+)?$/;
  var reOperator = /^[\/\+\*\-]$/;
  var precedence = { "+": 1, "-": 1, "*": 2, "/": 2 };

  for (var i = 0; i < tokens.length; ++i)
  {
    var t = tokens[i];
    if (reNumber.test(t))
      output.push(Number(t));
    else if (reOperator.test(t))
    {
      while (operators.length && precedence[t] <= precedence[operators[operators.length - 1]])
      {
        output.push(operators.pop());
      }

      operators.push(t);
    }
    else if (t == "(")
      operators.push(t);
    else if (t == ")")
    {
      while (operators.length && operators[operators.length - 1] != "(")
        output.push(operators.pop());

      if (!operators.length) return false;

      operators.pop();    
    }
    else 
      return false;
  }

  while (operators.length)
    output.push(operators.pop());

  var result = [];

  for (i = 0; i < output.length; ++i)
  {
    t = output[i];
    if (reNumber.test(t))
      result.push(t);
    else if (t == "(" || result.length < 2)
      return false;
    else 
    {
      var lhs = result.pop();
      var rhs = result.pop();

      if (t == "+") result.push(lhs + rhs);
      if (t == "-") result.push(lhs - rhs);
      if (t == "*") result.push(lhs * rhs);
      if (t == "/") result.push(lhs / rhs);
    }
  }

  return result.pop();
}

Il prend en charge les numéros et + - * / ( ) . Les jetons doivent être séparés par un seul espace, par ex : "1 * ( 2 + 3 )"

Quoi qu'il en soit, c'est le type de code dont vous auriez besoin si vous ne vouliez pas utiliser eval .

0voto

Tracker1 Points 6573

Essayez ceci...

function EQ(input) {
  try {
    var ret = Number(eval('(0+(' + input + '))'));
    return isNaN(ret) ? null : ret;
  } catch(err) {
  }
  return null;
}

Vous pouvez remplacer le null par défaut par un false littéral si vous le souhaitez...

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X