Есть ли способ в 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 (у меня есть математическая грамматика как отправная точка) и фактически компилировать/интерпретировать выражение самостоятельно.
Недавно я разработал синтаксический анализатор выражений и выпустил его под лицензией 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)");
В самом деле, yu должен знать, что результат следующей инструкции в javascript:
eval('var aa=5+4*(7-15)')
aa // -27
Там может быть лучший способ, но он работает.
Возможно, не так прямо, как вы надеетесь!
Но, возможно, вы могли бы использовать javax.script.ScriptEngine и рассматривать строку как выражение ECMAScript, например?
Взгляните на: Скрипты для платформы Java.
Нет встроенного способа сделать это. Но вы можете использовать один из многих калькуляторов с открытым исходным кодом.
В Java SDK нет прямой поддержки для этого.
Вам придется либо реализовать его самостоятельно (возможно, используя генератор синтаксического анализатора, такой как JavaCC), либо использовать существующую библиотеку.
Один из вариантов: JEP (коммерческий), другой JEval (бесплатное программное обеспечение).
В последнее время я использовал очень зрелую библиотеку парсеров с математическим выражением, с открытым исходным кодом, предоставляя тот же API для JAVA и .NET. Имя библиотеки - mXparser. mXparser предоставляет базовые функции (простой анализ и вычисления простых формул) и более продвинутые (т.е. пользовательские аргументы, функции). Кроме того, стоит заметить, что mXparser имеет богатую встроенную математическую коллекцию (что означает операторы, унарные/двоичные/вариативные функции, итерированные операторы, такие как суммирование и продукт).
http://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();
С уважением,
ЛК
Там есть коммерческий инструмент под названием formula4j, который выполняет эту работу.
Чтобы взять выражение вашего примера, оно будет оцениваться следующим образом с помощью формулы4j:
Formula formula = new Formula("5+4*(7-15)");
Decimal answer = formula.getAnswer(); //-27
Вы можете использовать проект
Как использовать:
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;
}