web-dev-qa-db-fra.com

Comment analyser une expression mathématique donnée sous forme de chaîne et renvoyer un nombre?

Existe-t-il un moyen dans Java pour obtenir le résultat de cette expression mathématique:

String code = "5+4*(7-15)";

D'un autre côté, quelle est la meilleure façon d'analyser une expression arithmétique?

38
Martijn Courteaux

Vous pouvez le passer à un BeanShellbsh.Interpreter, quelque chose comme ça:

Interpreter interpreter = new Interpreter();
interpreter.eval("result = 5+4*(7-15)");
System.out.println(interpreter.get("result"));

Vous voudrez vous assurer que la chaîne que vous évaluez provient d'une source fiable et des précautions habituelles, mais sinon cela fonctionnera immédiatement.

Si vous voulez adopter une approche plus compliquée (mais plus sûre), vous pouvez utiliser ANTLR (que je soupçonne avoir une grammaire mathématique comme point de départ) et réellement compiler/interpréter la déclaration vous-même.

34
Nick Holt

j'ai récemment développé un analyseur d'expression et l'ai publié sous la licence Apache. vous pouvez le récupérer sur http://projects.congrace.de/exp4j/index.html

espérons que cela a aidé

30
fasseg

Vous pouvez utiliser la classe ScriptEngine et l'évaluer comme une chaîne javascript

ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("js");        
Object result = engine.eval("5+4*(7-15)");

En effet, vous devez savoir que le résultat de l'instruction suivante en javascript:

   eval('var aa=5+4*(7-15)')
   aa // -27

Il y a peut-être une meilleure façon, mais celle-ci fonctionne.

7
Abdennour TOUMI

Probablement pas d'une manière aussi simple que vous l'espérez!

Mais vous pourriez peut-être utiliser un javax.script.ScriptEngine et traiter la chaîne comme une expression ECMAScript, par exemple?

Jetez un œil à: Script pour la plate-forme Java .

5
Andy

Il n'y a aucun moyen intégré de le faire. Mais vous pouvez utiliser l'un des nombreux calculateurs open source disponibles.

4
soulmerge

Récemment, j'utilisais une bibliothèque d'analyse mathématique très mature, open source, donnant la même API pour Java et .NET. Le nom de la bibliothèque est mXparser. MXparser fournit des fonctionnalités de base (analyse et calcul de formules simples) et plus avancées (par exemple, les arguments définis par l'utilisateur, les fonctions). En outre, il convient de noter que mXparser possède une riche collection mathématique intégrée (c'est-à-dire des opérateurs, des fonctions unaires/binaires/variadiques, des opérateurs itérés tels que la sommation et le produit).

http://mathparser.org/

http://mathparser.org/mxparser-tutorial/

Veuillez trouver ci-dessous quelques exemples pour avoir une vue plus claire de la syntaxe.

Exemple 1 - formule simple

Expression e = new Expression("2+3");
double v = e.calculate();

Exemple 2 - fonction intégrée

Expression e = new Expression("2+sin(3)");
double v = e.calculate();

Exemple 3 - constantes intégrées

Expression e = new Expression("2+sin(pi)");
double v = e.calculate();

Exemple 4 - Arguments et constantes définis par l'utilisateur

Argument x = new Argument("x = 5");
Constant a = new Constant("a = 2 + sin(3)");
Expression e = new Expression("a + x^2", x, a);
double v1 = e.calculate();
x.setArgumentValue(10);
double v2 = e.calculate();

Exemple 5 - fonctions définies par l'utilisateur

Function f = new Function("f(x,y) = x^2 + cos(y)");
Expression e = new Expression("f(10,pi) - 3", f);
double v = e.calculate();

Exemple 6 - récursivité définie par l'utilisateur

Function factorial = new Function("fact(n) = if( n > 0; n*fact(n-1); 1)");
Expression e = new Expression("fact(10) - 10!", factorial);
double v = e.calculate();

Trouvé récemment - au cas où vous voudriez essayer la syntaxe (et voir le cas d'utilisation avancé), vous pouvez télécharger l'application Scalar Calculator qui est propulsée par mXparser.

Meilleures salutations

LK

3
Leroy Kegan

Il n'y a pas de prise en charge directe dans le SDK Java pour cela.

Vous devrez soit l'implémenter vous-même (éventuellement en utilisant un générateur d'analyseur tel que JavaCC), soit utiliser une bibliothèque existante.

Une option serait JEP (commercial), une autre JEval (logiciel gratuit).

1
sleske

Il existe un outil commercial appelé formula4j qui fait ce travail.

Pour prendre votre exemple d'exemple, il serait évalué comme ceci en utilisant la formule 4j:

Formula formula = new Formula("5+4*(7-15)");

Decimal answer = formula.getAnswer(); //-27

0
John O

Vous pouvez utiliser cela projet

Comment utiliser:

double result = 0;
String code = "5+4*(7-15)";
try {
    Expr expr = Parser.parse(code);
    result = expr.value();
} catch (SyntaxException e) {
    e.printStackTrace();
}
System.out.println(String.format("Result: %.04f", result));
0
Jc Miñarro