Comment analyser une expression mathématique donnée comme une chaîne et retourner un nombre? [dupliquer]

cette question a déjà une réponse ici:

Est-il un moyen en Java pour obtenir le résultat de cette expression mathématique:

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

dans l'autre main ce qui est le meilleur façon d'analyser une expression arithmétique?

36
demandé sur Mark Rotteveel 2009-09-16 14:49:51

10 réponses

vous pouvez le passer à un BeanShell bsh.Interpreter , quelque chose comme ceci:

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 est d'une source fiable et les précautions habituelles, mais sinon, il va travailler tout de suite.

si vous voulez aller une approche plus compliquée (mais plus sûr), vous pourriez utiliser ANTLR (que je soupçonne a une grammaire mathématique comme point de départ) et en fait compilez / interprétez la déclaration vous-même.

34
répondu Nick Holt 2009-09-16 11:17:09

j'ai récemment développé un analyseur d'expression et publié sous la licence apache. vous pouvez l'attraper à http://projects.congrace.de/exp4j/index.html

l'espérance qui a contribué à

29
répondu fasseg 2011-03-09 16:03:34

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, yu devrait 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 un meilleur moyen, mais celui-ci fonctionne.

7
répondu Abdennour TOUMI 2014-04-21 04:11:31

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

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

Prendre un coup d'oeil à: la programmation de la Plate-forme Java .

5
répondu Andy 2009-09-16 10:57:31

il n'y a aucune façon de faire cela. Mais vous pouvez utiliser l'un des nombreux Calculatrices open source disponibles.

4
répondu soulmerge 2009-09-16 10:55:52

récemment, j'ai utilisé la bibliothèque très mature de l'analyseur d'expressions mathématiques, 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 (parsing et calcul de formules simples) et plus avancées (c'est-à-dire des arguments définis par l'Utilisateur, des fonctions). De plus, il est intéressant de noter que mXparser a une riche collection de mathématiques intégrées (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 plus de vision claire sur 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 incorporé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-recursion 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();

meilleures salutations,

LK

3
répondu Leroy Kegan 2016-03-31 19:22:13

il n'y a pas de support direct dans le SDK Java pour faire cela.

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

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

2
répondu sleske 2009-09-16 10:58:51

il y a un outil commercial appelé formula4j qui fait ce travail.

pour prendre votre expression d'exemple, elle serait évaluée comme ceci en utilisant formula4j:

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

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

0
répondu John O 2013-02-15 00:43:15

Vous coul utiliser 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
répondu Jc Miñarro 2014-01-21 20:31:20
public static int calc(String string){
    int result=0; 
    String numbers="0123456789";
    String operations="+-/*";
    for (int i=0;i<string.length();i++){
        if (numbers.contains(string.charAt(i)+"")){
            result=result*10+(Integer.parseInt(string.charAt(i)+""));
            }
        else {
            if (string.charAt(i)=='+'){ result+=calc(string.substring(i+1));}
            if (string.charAt(i)=='-'){ result-=calc(string.substring(i+1));}
            if (string.charAt(i)=='*'){ result*=calc(string.substring(i+1));}
            if (string.charAt(i)=='/'){ try{result/=calc(string.substring(i+1));}
                catch (ArithmeticException e){
                    System.err.println("You cannot devide by Zero!");}
            }  
            break;
        }        
    }
    return result;
}
-2
répondu Semioniy 2014-12-19 10:51:25