Вопрос-ответ

How to parse a mathematical expression given as a string and return a number? [duplicate]

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

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

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

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

Переведено автоматически
Ответ 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)");

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

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

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

Ответ 4

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

https://mathparser.org/

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

2023-07-06 17:34 java string