【发布时间】:2014-08-22 12:26:59
【问题描述】:
我有一个字符串,例如 str="3+5-4+4+5"; 我可以使用 split() 拆分它;方法,但我怎样才能像这个字符串一样计算超过 2 个数字
【问题讨论】:
-
你试过
System.execute("calc.exe", "3+5-4+4+5");
标签: java
我有一个字符串,例如 str="3+5-4+4+5"; 我可以使用 split() 拆分它;方法,但我怎样才能像这个字符串一样计算超过 2 个数字
【问题讨论】:
System.execute("calc.exe", "3+5-4+4+5");
标签: java
你可以试试这个:
import javax.script.ScriptEngineManager;
import javax.script.ScriptEngine;
String str = "3+5-4+4+5";
public void myStringCalculation(String str)
{
ScriptEngineManager x = new ScriptEngineManager();
ScriptEngine e = x.getEngineByName("JavaScript");
System.out.println(e.eval(str));
}
【讨论】:
Interpreter 课程。
你可以这样做:
【讨论】:
看看这个SO link - 有现成的解析器可以解释数学表达式并返回它的结果。
【讨论】:
我假设你想尝试编码。
您可以使用number operator number 形式的可简化表达式尽可能地简化表达式。
这里是二元运算符的简单版本,没有大括号,没有负数,只有。
String[] operators = new String[] {
"*", "/",
"+", "-"
};
String expr = "3+5-4+4+5";
for (;;) {
boolean reduced = false;
for (String op : operators) {
Pattern redex = Pattern.compile("(\\d+)" + Pattern.quote(op) + "(-?\\d+)");
Matcher m = term.matcher(expr);
StringBuffer sb = new StringBuffer();
while (m.find()) {
int lhs = Integer.parseInt(m.group(1));
int rhs = Integer.parseInt(m.group(2));
int y = 0;
switch (op) {
case "*": y = lhs * rhs; break;
case "/": y = lhs / rhs; break;
case "+": y = lhs + rhs; break;
case "-": y = lhs - rhs; break;
default: throw new IllegalStateException("Not implemented: " + op);
}
m.appendReplacement(sb, String.valueOf(y));
reduced = true;
}
m.appendTail(sb);
expr = sb.toString();
}
if (!reduced) {
break;
}
}
负数可以与正则表达式中的(负)前瞻/后视一起发挥作用。
【讨论】: