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?
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.
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é à
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.
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 .
il n'y a aucune façon de faire cela. Mais vous pouvez utiliser l'un des nombreux Calculatrices open source disponibles.
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/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
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).
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));
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;
}