Подтвердить что ты не робот

Как анализировать математическое выражение, заданное как строку, и возвращать число?

Есть ли способ в Java получить результат из этого математического выражения:

String code = "5+4*(7-15)";

С другой стороны, что лучший способ проанализировать арифметическое выражение?

4b9b3361

Ответ 1

Вы можете передать его BeanShell bsh.Interpreter, примерно так:

Interpreter interpreter = new Interpreter();
interpreter.eval("result = 5+4*(7-15)");
System.out.println(interpreter.get("result"));

Вы хотите, чтобы строка, которую вы оцениваете, была получена из надежного источника и обычных мер предосторожности, но в противном случае это сработает.

Если вы хотите перейти к более сложному (но безопасному) подходу, вы можете использовать ANTLR (у меня есть математическая грамматика как отправная точка) и фактически компилировать/интерпретировать выражение самостоятельно.

Ответ 2

Недавно я разработал синтаксический анализатор выражений и выпустил его под лицензией apache. вы можете взять его на http://projects.congrace.de/exp4j/index.html

надеюсь, что это помогло

Ответ 3

Вы можете использовать класс 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

Там может быть лучший способ, но он работает.

Ответ 4

Возможно, не так прямо, как вы надеетесь!

Но, возможно, вы могли бы использовать javax.script.ScriptEngine и рассматривать строку как выражение ECMAScript, например?

Взгляните на: Скрипты для платформы Java.

Ответ 6

В Java SDK нет прямой поддержки для этого.

Вам придется либо реализовать его самостоятельно (возможно, используя генератор синтаксического анализатора, такой как JavaCC), либо использовать существующую библиотеку.

Один из вариантов: JEP (коммерческий), другой JEval (бесплатное программное обеспечение).

Ответ 7

В последнее время я использовал очень зрелую библиотеку парсеров с математическим выражением, с открытым исходным кодом, предоставляя тот же API для JAVA и .NET. Имя библиотеки - mXparser. mXparser предоставляет базовые функции (простой анализ и вычисления простых формул) и более продвинутые (т.е. пользовательские аргументы, функции). Кроме того, стоит заметить, что mXparser имеет богатую встроенную математическую коллекцию (что означает операторы, унарные/двоичные/вариативные функции, итерированные операторы, такие как суммирование и продукт).

http://mathparser.org/

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();

С уважением,

ЛК

Ответ 8

Там есть коммерческий инструмент под названием formula4j, который выполняет эту работу.

Чтобы взять выражение вашего примера, оно будет оцениваться следующим образом с помощью формулы4j:

Formula formula = new Formula("5+4*(7-15)");

Decimal answer = formula.getAnswer(); //-27

Ответ 9

Вы можете использовать проект

Как использовать:

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));

Ответ 10

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;
}