java- engine.eval(«Строка с уравнением»); и я хочу получить вывод BigDecimal

#java

#java

Вопрос:

Я попробовал несколько способов получить BigDecimal в качестве вывода из engine.eval() безрезультатно. пример кода, который я пробовал, приведен ниже:

 ScriptEngine engine = new ScriptEngineManager().getEngineByName("rhino");
String calculation= "8 8 3*56";
BigDecimal finalResult= BigDecimal.ZERO; 


try {
                finalResult = (BigDecimal) engine.eval(calculation);
} 
catch (ScriptException e) {
                    Toast toast = Toast.makeText(getApplicationContext(), "Wrong input.", Toast.LENGTH_SHORT);
                    toast.show();
                }
 

У вас есть какие-либо предложения?

Комментарии:

1. String calculation = "new java.math.BigDecimal(8).add(new java.math.BigDecimal(8)).add(new java.math.BigDecimal(3)).multiply(new java.math.BigDecimal(56))";

Ответ №1:

Во-первых, вы должны использовать Java 6 или 7, потому что только эти версии Java включают движок "rhino" JavaScript. В Java с 8 по 14 назван движок JavaScript "nashorn" . Java 15 больше не поставляется с движком JavaScript. Чтобы работать с Java с 6 по 14, укажите имя "JavaScript" .

Во-вторых, выражение возвращает число, но точный тип не обязательно четко определен. Я считаю, что это всегда будет Double для JavaScript, но если вы используете другой движок выражений, тип может отличаться, поэтому лучше принудить результат к BigDecimal себе.

Однако это легко сделать следующим образом:

 ScriptEngine engine = new ScriptEngineManager().getEngineByName("JavaScript");
String calculation = "8 8 3*56";
Object result = engine.eval(calculation);
BigDecimal finalResult = (result instanceof BigDecimal
                          ? (BigDecimal) result
                          : BigDecimal.valueOf(((Number) result).doubleValue()));
System.out.println(finalResult);
 

Вывод

 184.0
 

Ответ №2:

Попробуйте

 finalResult = new BigDecimal(engine.eval(calculation));
 

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

Комментарии:

1. Это не будет компилироваться.