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?
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.
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é
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.
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 .
Il n'y a aucun moyen intégré de le faire. Mais vous pouvez utiliser l'un des nombreux calculateurs open source disponibles.
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/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
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
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));