如何在Kotlin中求解字符串形式的数学表达式?
在Kotlin中计算字符串形式的数学表达式
下面是几种实用的实现方式,覆盖不同场景需求:
方法一:利用Java Script引擎(快速实现,无需额外依赖)
JDK自带的ScriptEngine可以调用JavaScript引擎解析计算表达式,适合快速验证简单场景:
import javax.script.ScriptEngineManager fun evaluateExpression(expr: String): Double { val engine = ScriptEngineManager().getEngineByName("JavaScript") return engine.eval(expr) as Double } // 调用示例 fun main() { val example1 = "3+5" val example2 = "3*5/3" println(evaluateExpression(example1)) // 输出8.0 println(evaluateExpression(example2)) // 输出5.0 }
注意:这种方式依赖JDK的ScriptEngine实现,Android环境下可能需要额外配置,且对复杂自定义表达式支持有限。
方法二:手动实现表达式解析(适合自定义规则,无依赖)
如果需要完全控制解析逻辑,比如处理特定运算或优先级,可以手动实现简单的表达式解析。下面是支持加减乘除、考虑运算优先级的示例:
fun calculate(expr: String): Double { // 按+/-分割表达式,保留运算符 val parts = expr.split("(?=[+-])".toRegex()) var result = 0.0 for (part in parts) { // 按*/分割每个加减项,处理乘除优先级 val subParts = part.split("(?=[*/])".toRegex()) var subResult = subParts[0].toDouble() for (i in 1 until subParts.size) { val op = subParts[i][0] val num = subParts[i].substring(1).toDouble() when (op) { '*' -> subResult *= num '/' -> subResult /= num } } // 处理加减符号 if (part.startsWith('-')) { result -= subResult } else { result += subResult } } return result } // 调用示例 fun main() { println(calculate("3+5")) // 8.0 println(calculate("3*5/3")) //5.0 println(calculate("10-3*2+4/2")) // 6.0 }
这个实现先拆分加减项,再逐个处理项内的乘除运算,保证了运算优先级。如果需要支持括号、更复杂运算符,可以扩展为递归下降解析器。
方法三:使用第三方表达式库(适合复杂场景)
如果需要支持括号、数学函数(如sin、log)等复杂特性,可以使用成熟的第三方库,比如Exp4j:
- 添加Gradle依赖:
dependencies { implementation 'net.objecthunter:exp4j:0.4.8' }
- 代码示例:
import net.objecthunter.exp4j.Expression import net.objecthunter.exp4j.ExpressionBuilder fun evaluateComplexExpression(expr: String): Double { val expression: Expression = ExpressionBuilder(expr).build() return expression.evaluate() } // 调用示例 fun main() { println(evaluateComplexExpression("3+5*(2-1)")) // 8.0 println(evaluateComplexExpression("sin(PI/2) + log(10)")) // 2.0 }
该库支持运算符优先级、括号、常用数学函数等,适合复杂表达式计算。
内容的提问来源于stack exchange,提问作者Latte
相关产品推荐
相关产品推荐

