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

StackOverflow https://stackoverflow.com/questions/1432245

Вопрос

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

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

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

Это было полезно?

Решение

Вы можете передать его в Бобовая скорлупа 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)");

Действительно , вы должны знать , что результат выполнения следующей инструкции в javascript :

   eval('var aa=5+4*(7-15)')
   aa // -27

Возможно, есть способ получше, но этот работает.

Вероятно, не так прямолинейно, как вы надеетесь!

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

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

Встроенного способа сделать это не существует.Но вы можете использовать один из многих калькуляторы с открытым исходным кодом Доступно.

Недавно я использовал очень зрелую библиотеку синтаксического анализа математических выражений с открытым исходным кодом, предоставляющую тот же 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();

Найдено недавно - в случае, если вы хотите попробовать синтаксис (и посмотреть расширенный вариант использования), вы можете загрузить Скалярный Калькулятор приложение, работающее на базе mXparser.

С наилучшими пожеланиями

ЛК

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

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

Одним из вариантов было бы ДЖЕП (коммерческий), другой Джевал (свободное программное обеспечение).

Есть коммерческий инструмент под названием формула 4j это делает свою работу.

Чтобы взять ваше примерное выражение, оно было бы вычислено следующим образом, используя formula4j:

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;
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top