Есть ли в Java способ получить результат из этого математического выражения:
String code = "5+4*(7-15)";
С другой стороны, как лучше всего разобрать арифметическое выражение?
Есть ли в Java способ получить результат из этого математического выражения:
String code = "5+4*(7-15)";
С другой стороны, как лучше всего разобрать арифметическое выражение?
Вы можете передать его в BeanShell bsh.Interpreter
, примерно так:
Interpreter interpreter = new Interpreter();
interpreter.eval("result = 5+4*(7-15)");
System.out.println(interpreter.get("result"));
Вы должны убедиться, что строка, которую вы оцениваете, получена из надежного источника и с обычными мерами предосторожности, но в противном случае она будет работать сразу.
Если вы хотите использовать более сложный (но более безопасный) подход, вы можете использовать ANTLR (который, как я подозреваю, имеет математический грамматика в качестве отправной точки) и фактически составьте / интерпретируйте утверждение самостоятельно.
javax.script
API (я думаю, что Rhino) было бы лучше.
- person Nick Holt; 16.09.2009
Недавно я разработал парсер выражений и выпустил его под лицензией apache. вы можете скачать его на http://projects.congrace.de/exp4j/index.html
надеюсь, что это помогло
Вы можете использовать класс ScriptEngine и оценивать его как строку javascript
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("js");
Object result = engine.eval("5+4*(7-15)");
Действительно, вы должны знать, что результат следующей инструкции в javascript:
eval('var aa=5+4*(7-15)')
aa // -27
Может быть способ получше, но этот работает.
javax.script.*
- person Abdennour TOUMI; 20.06.2017
Вероятно, не так просто, как вы надеетесь!
Но, возможно, вы могли бы использовать javax.script.ScriptEngine и, например, рассматривать строку как выражение ECMAScript?
Взгляните на: Сценарии для Платформа Java.
Для этого нет встроенного способа. Но вы можете использовать один из многих калькуляторов с открытым исходным кодом доступный.
Недавно я использовал очень зрелую библиотеку анализатора математических выражений с открытым исходным кодом, предоставляющую тот же API для JAVA и .NET. Имя библиотеки - mXparser. mXparser предоставляет базовые функции (простой анализ и вычисление формул) и более сложные (т. е. определяемые пользователем аргументы, функции). Кроме того, стоит отметить, что mXparser имеет богатую встроенную математическую коллекцию (то есть операторы, унарные / двоичные / вариативные функции, повторяющиеся операторы, такие как суммирование и произведение).
https://mathparser.org/mxparser-tutorial/
Ниже приведены несколько примеров, чтобы лучше понять синтаксис.
Пример 1 - простая формула
Expression e = new Expression("2+3");
double v = e.calculate();
Пример 2 - встроенная функция
Expression e = new Expression("2+sin(3)");
double v = e.calculate();
Пример 3 - встроенные константы
Expression e = new Expression("2+sin(pi)");
double v = e.calculate();
Пример 4 - аргументы и константы, определяемые пользователем
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();
Пример 5 - определяемые пользователем функции
Function f = new Function("f(x,y) = x^2 + cos(y)");
Expression e = new Expression("f(10,pi) - 3", f);
double v = e.calculate();
Пример 6 - определяемая пользователем рекурсия
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();
Найдено недавно - если вы хотите попробовать синтаксис (и увидеть расширенный вариант использования), вы можете загрузить Скалярный калькулятор приложение, работающее на mXparser.
С наилучшими пожеланиями
LK
В Java SDK нет прямой поддержки для этого.
Вам придется либо реализовать его самостоятельно (возможно, с помощью генератора синтаксического анализатора, такого как JavaCC), либо использовать существующую библиотеку.
Один вариант - JEP (коммерческий), другой - JEval (бесплатное программное обеспечение).
Вы можете использовать этот проект
Как пользоваться:
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));
Есть инструмент с открытым исходным кодом под названием formula4j, который выполняет эту работу.
Чтобы взять ваше примерное выражение, оно будет оцениваться следующим образом с помощью formula4j:
Formula formula = new Formula("5+4*(7-15)");
Decimal answer = formula.getAnswer(); //-27