如何计算出字符串 "3*4+5"的值啊

小幸运(●ˇ∀ˇ●) 2011-05-10 04:16:40
如何计算出字符串 像"3*4+5"的值啊
...全文
226 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 ticmy 的回复:]
jdk1.6可以这样做:

Java code
import javax.script.*;
public class TestScript {
public static void main(String[] args) throws Exception {
String exp = "3*4+5";
ScriptEngineManager ……
[/Quote]
不过计算"3*4+5%5”会出错啊!!!!!!!11


joaryyu 2011-05-10
  • 打赏
  • 举报
回复
  • 打赏
  • 举报
回复
果然可以,大神就是大神啊!!
joaryyu 2011-05-10
  • 打赏
  • 举报
回复
可以动态编译

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

import javax.tools.JavaCompiler;
import javax.tools.ToolProvider;


public class DyComp {
String expr = null;

public static double execute(String expr) {
DyComp dc = new DyComp(expr);
double result = -99999;
try {
result = dc.result();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return result;
}

//私有构造
private DyComp(String expr) {
this.expr = expr;
}

public double result() throws IOException {
String javafileContent = "import java.io.*;\r\n" +
"public class ExpreDyComp {" + "\r\n" +
"public static double cal() {\r\n" +
"\tdouble var = " + this.expr + ";\r\n" +
"return var;\r\n" +
"}\r\n}";
System.out.println("待生成的文件内容" + "\n" + javafileContent);
File tmpFile = new File("ExpreDyComp.java");
tmpFile.createNewFile();
PrintWriter printWriter = new PrintWriter(new FileWriter(tmpFile));
printWriter.write(javafileContent);
printWriter.flush();
printWriter.close();
//对文件进行编译
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
int compRes = compiler.run(null, null, null,"-d","bin","ExpreDyComp.java");
if(compRes != 0) {
System.out.println("编译出错");
}

Class exprClass = null;
try {
exprClass = Class.forName("ExpreDyComp");
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.err.println("找不到相应类");
}
Method m = null;
try {
if(exprClass != null) {
m = exprClass.getMethod("cal");
}
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if(m != null) {
try {
Double d = (Double)m.invoke(null);
//System.out.println("值为" + d.doubleValue());
return d.doubleValue();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return -9999;
}

private double readResultToFile(File inFile) throws IOException {
BufferedReader bf = new BufferedReader(new FileReader(inFile));
String content = bf.readLine();
double res = 0;
if(content != null) {
res = Double.parseDouble(content);
} else {
System.out.println("文件" + inFile.getAbsolutePath() + "无数据");
}
bf.close();
return res;
}

public static void main(String args[]) {
System.out.println("动态编译");
System.out.println("输入你要计算的表达式");
InputStreamReader inputReader = new InputStreamReader(System.in);
BufferedReader bfReader = new BufferedReader(inputReader);
String expre = null;
try {
expre = bfReader.readLine();
} catch (IOException e1) {
// TODO Auto-generated catch block
System.out.println("从键盘输入出现问题");
e1.printStackTrace();
}
//定义结果数据
double result = -99999;
result = execute(expre);
//打印到console
System.out.println(expre + "计算结果如下" + "\n" + result);
}
}

龙四 2011-05-10
  • 打赏
  • 举报
回复
jdk1.6可以这样做:
import javax.script.*;
public class TestScript {
public static void main(String[] args) throws Exception {
String exp = "3*4+5";
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("js");
Object result = engine.eval(exp);

System.out.println("结果类型:" + result.getClass().getName() + ",计算结果:" + result);

}
}

amos1989 2011-05-10
  • 打赏
  • 举报
回复
如果是JDK6以下的版本,解决的办法也有很多。

可以对字符串进行解析。

龙四 2011-05-10
  • 打赏
  • 举报
回复
上面是jdk1.5的做法

需要下载

commons-jexl-2.0.1.jar
commons-logging-1.1.1.jar
bsf-api-3.1.jar

加到classpath中就可以运行了
amos1989 2011-05-10
  • 打赏
  • 举报
回复
楼上的已经解决了。。
龙四 2011-05-10
  • 打赏
  • 举报
回复
jdk1.6可以这样做:
import javax.script.*;
public class TestScript {
public static void main(String[] args) throws Exception {
String exp = "3*4+5";
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("jexl");
Object result = engine.eval(exp);

System.out.println("结果类型:" + result.getClass().getName() + ",计算结果:" + result);

}
}

67,515

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧