125 votes

Évaluation d'une chaîne de caractères en tant qu'expression mathématique en JavaScript

Comment analyser et évaluer une expression mathématique dans une chaîne de caractères (par ex. '1+1' ) sans invoquer eval(string) pour obtenir sa valeur numérique ?

Avec cet exemple, je veux que la fonction accepte '1+1' et retourner 2 .

3voto

wheresrhys Points 6087

J'ai finalement opté pour cette solution, qui fonctionne pour la somme des entiers positifs et négatifs (et avec une petite modification de la regex, elle fonctionnera aussi pour les décimales) :

function sum(string) {
  return (string.match(/^(-?\d+)(\+-?\d+)*$/)) ? string.split('+').stringSum() : NaN;
}   

Array.prototype.stringSum = function() {
    var sum = 0;
    for(var k=0, kl=this.length;k<kl;k++)
    {
        sum += +this[k];
    }
    return sum;
}

Je ne sais pas si c'est plus rapide que eval(), mais comme je dois effectuer l'opération de nombreuses fois, je suis beaucoup plus à l'aise en exécutant ce script qu'en créant des tas d'instances du compilateur javascript.

3voto

ArchHaskeller Points 273

Essayez nerdamer

var result = nerdamer('12+2+PI').evaluate();
document.getElementById('text').innerHTML = result.text();

<script src="http://nerdamer.com/js/nerdamer.core.js"></script>
<div id="text"></div>

2voto

fuser Points 223

Je crois que parseInt y ES6 peut être utile dans cette situation

let func = (str) => {
  let arr = str.split("");
  return `${Number(arr[0]) + parseInt(arr[1] + Number(arr[2]))}`
};

console.log(func("1+1"));

L'essentiel ici est que parseInt analyse le nombre avec l'opérateur. Le code peut être modifié selon les besoins correspondants.

2voto

Rushikesh Bharad Points 195
const operatorToFunction = {
    "+": (num1, num2) => +num1 + +num2,
    "-": (num1, num2) => +num1 - +num2,
    "*": (num1, num2) => +num1 * +num2,
    "/": (num1, num2) => +num1 / +num2
}

const findOperator = (str) => {
    const [operator] = str.split("").filter((ch) => ["+", "-", "*", "/"].includes(ch))
    return operator;
}

const executeOperation = (str) => {
    const operationStr = str.replace(/[ ]/g, "");
    const operator = findOperator(operationStr);
    const [num1, num2] = operationStr.split(operator)
    return operatorToFunction[operator](num1, num2);
};

const addition = executeOperation('1 + 1'); // ans is 2
const subtraction = executeOperation('4 - 1'); // ans is 3
const multiplication = executeOperation('2 * 5'); // ans is 10
const division = executeOperation('16 / 4'); // ans is 4

1voto

Justin Jose Points 74

Essayez AutoCalculator https://github.com/JavscriptLab/autocalculate Calculer la valeur des entrées et de la sortie en utilisant des expressions sélectives.

Il suffit d'ajouter un attribut pour votre entrée de sortie comme data-ac="(#firstinput+#secondinput)"

Pas besoin d'initialisation, il suffit d'ajouter l'attribut data-ac. Il trouvera automatiquement les éléments ajoutés dynamiquement.

Pour ajouter 'Rs' à la sortie, il suffit de l'ajouter à l'intérieur des crochets. data-ac="{Rs}(#firstinput+#secondinput)"

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