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

StackOverflow https://stackoverflow.com/questions/1432245

Question

    

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

         

Existe-t-il un moyen en Java d’obtenir le résultat de cette expression mathématique:

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

D'autre part, quel est le meilleur moyen d'analyser une expression arithmétique?

Était-ce utile?

La solution

Vous pouvez le transmettre à 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 provient d'une source fiable et des précautions habituelles, sinon elle fonctionnera immédiatement.

Si vous souhaitez adopter une approche plus complexe (mais plus sûre), vous pouvez utiliser ANTLR (je suppose s’appuie sur une grammaire mathématique) et compile / interprète lui-même l’instruction soi-même.

Autres conseils

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

.

espérons que cela a aidé

Vous pouvez utiliser la classe ScriptEngine et l'évaluer en tant que chaîne javascript

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

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

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

Il existe peut-être un meilleur moyen, mais celui-ci fonctionne.

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?

Consultez: Script pour la plate-forme Java .

Il n’existe pas de méthode intégrée pour le faire. Mais vous pouvez utiliser l’un des nombreux calculatrices en code source ouvert . disponible.

Récemment, j’utilisais une bibliothèque d’analyseur d’expression mathématique très mature, à code source ouvert, 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 des fonctions plus avancées (arguments et fonctions définis par l'utilisateur). De plus, il convient de noter que mXparser possède une riche collection mathématique intégrée (opérateurs, fonctions unary / binary / variadic, opérateurs itérés tels que sommation et produit).

http://mathparser.org/

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

Veuillez trouver ci-dessous quelques exemples pour avoir une vision 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écursion 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ée), vous pouvez télécharger le fichier Calculatrice scalaire : une application générée par mXparser.

Cordialement

LK

Le kit de développement logiciel Java ne prend pas directement en charge cette opération.

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

Une des options serait JEP (commercial), une autre JEval (logiciel libre).

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

Pour prendre votre exemple d'expression, il serait évalué comme ceci en utilisant la formule4j:

Formule de formule = nouvelle formule ("5 + 4 * (7-15)");

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

Vous pouvez utiliser ce 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));
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;
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top