#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. Это не будет компилироваться.