Comment analyser une expression mathématique donnée sous forme de chaîne et renvoyer un nombre? [dupliquer]
-
07-07-2019 - |
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?
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/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;
}