String f="30*12*0.3+5", 如何让他动态执行,f的值不固定

andy0618 2008-10-11 11:51:54
String f="30*12*0.3+5", 如何让他动态执行,f的值不固定
...全文
987 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
ilce11 2008-10-11
  • 打赏
  • 举报
回复
我觉得二楼的说的对,,
你都用""了,表示是字符串,怎么计算啊。。
直接得出f的值为30*12*0.3+5
ilce11 2008-10-11
  • 打赏
  • 举报
回复
我觉得二楼的说的对,,
你都用""了,表示是字符串,怎么计算啊。。
直接得出f的值为30*12*0.3+5
zz2617436 2008-10-11
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 ZangXT 的回复:]
Java code
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;

public class Test{
public static void main(String[] args) {
ScriptEngineManager manager = new ScriptEngineManager();

ScriptEngine engine = manager.getEngineByName("javascript");
try {
Double d = (Double) engine.eval("10*5+9…
[/Quote]

UP,UP,UP
ZangXT 2008-10-11
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 andy0618 的回复:]

to 做好自己的事情

javax.script.ScriptEngine
包在哪里
[/Quote]
java6自带的。
没有的话参考6楼的方法,动态编译。
andy0618 2008-10-11
  • 打赏
  • 举报
回复

to 做好自己的事情

javax.script.ScriptEngine
包在哪里
zjchxj 2008-10-11
  • 打赏
  • 举报
回复
三楼很强
ZangXT 2008-10-11
  • 打赏
  • 举报
回复
如果jdk是1.6以前的版本,参考
http://blog.csdn.net/axman/archive/2004/11/05/167002.aspx
ZangXT 2008-10-11
  • 打赏
  • 举报
回复
Double d = (Double) engine.eval("10*5+9-25/2");
eval中直接使用你的字符串表达式即可。
zhj92lxs 2008-10-11
  • 打赏
  • 举报
回复
按不同的运算符合拆串,然后计算,不知道还有没有别的方法
ZangXT 2008-10-11
  • 打赏
  • 举报
回复

import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;

public class Test{
public static void main(String[] args) {
ScriptEngineManager manager = new ScriptEngineManager();

ScriptEngine engine = manager.getEngineByName("javascript");
try {
Double d = (Double) engine.eval("10*5+9-25/2");
System.out.println(d);
} catch (ScriptException ex) {

}

}
}



使用jdk1.6
andy0618 2008-10-11
  • 打赏
  • 举报
回复
String f="30*12*0.3+5",

这个计算公式是一个字符串,如何计算这个字符串的值

zhj92lxs 2008-10-11
  • 打赏
  • 举报
回复
什么意思
valen_jia 2008-10-11
  • 打赏
  • 举报
回复
用EVAL函数
fosjos 2008-10-11
  • 打赏
  • 举报
回复
[Quote=引用 23 楼 ZangXT 的回复:]
表达式分析就用编译原理上的那堆东西吧。
[/Quote]
beanshell能把局部变量和类也整合到一起
也许真像ls说的“不是常人能够研究”

其实,我也只是想知道beanshell用到了java的什么特殊机制
ZangXT 2008-10-11
  • 打赏
  • 举报
回复
贴一个递归下降解析器的例子,来自The Art of Java一书。


/*
This module contains the recursive descent
parser that does not use variables.
*/

// Exception class for parser errors.
class ParserException extends Exception {
String errStr; // describes the error

public ParserException(String str) {
errStr = str;
}

public String toString() {
return errStr;
}
}

class Parser {
// These are the token types.
final int NONE = 0;
final int DELIMITER = 1;
final int VARIABLE = 2;
final int NUMBER = 3;

// These are the types of syntax errors.
final int SYNTAX = 0;
final int UNBALPARENS = 1;
final int NOEXP = 2;
final int DIVBYZERO = 3;

// This token indicates end-of-expression.
final String EOE = "\0";

private String exp; // refers to expression string
private int expIdx; // current index into the expression
private String token; // holds current token
private int tokType; // holds token's type

// Parser entry point.
public double evaluate(String expstr) throws ParserException
{
double result;
exp = expstr;
expIdx = 0;

getToken();
if(token.equals(EOE))
handleErr(NOEXP); // no expression present

// Parse and evaluate the expression.
result = evalExp2();

if(!token.equals(EOE)) // last token must be EOE
handleErr(SYNTAX);

return result;
}

// Add or subtract two terms.
private double evalExp2() throws ParserException
{
char op;
double result;
double partialResult;

result = evalExp3();

while((op = token.charAt(0)) == '+' || op == '-') {
getToken();
partialResult = evalExp3();
switch(op) {
case '-':
result = result - partialResult;
break;
case '+':
result = result + partialResult;
break;
}
}
return result;
}

// Multiply or divide two factors.
private double evalExp3() throws ParserException
{
char op;
double result;
double partialResult;

result = evalExp4();

while((op = token.charAt(0)) == '*' ||
op == '/' || op == '%') {
getToken();
partialResult = evalExp4();
switch(op) {
case '*':
result = result * partialResult;
break;
case '/':
if(partialResult == 0.0)
handleErr(DIVBYZERO);
result = result / partialResult;
break;
case '%':
if(partialResult == 0.0)
handleErr(DIVBYZERO);
result = result % partialResult;
break;
}
}
return result;
}

// Process an exponent.
private double evalExp4() throws ParserException
{
double result;
double partialResult;
double ex;
int t;

result = evalExp5();

if(token.equals("^")) {
getToken();
partialResult = evalExp4();
ex = result;
if(partialResult == 0.0) {
result = 1.0;
} else
for(t=(int)partialResult-1; t > 0; t--)
result = result * ex;
}
return result;
}

// Evaluate a unary + or -.
private double evalExp5() throws ParserException
{
double result;
String op;

op = "";
if((tokType == DELIMITER) &&
token.equals("+") || token.equals("-")) {
op = token;
getToken();

}
result = evalExp6();

if(op.equals("-")) result = -result;

return result;
}

// Process a parenthesized expression.
private double evalExp6() throws ParserException
{
double result;

if(token.equals("(")) {
getToken();
result = evalExp2();
if(!token.equals(")"))
handleErr(UNBALPARENS);
getToken();
}
else result = atom();

return result;
}

// Get the value of a number.
private double atom() throws ParserException
{
double result = 0.0;

switch(tokType) {
case NUMBER:
try {
result = Double.parseDouble(token);
} catch (NumberFormatException exc) {
handleErr(SYNTAX);
}
getToken();
break;
default:
handleErr(SYNTAX);
break;
}
return result;
}

// Handle an error.
private void handleErr(int error) throws ParserException
{
String[] err = {
"Syntax Error",
"Unbalanced Parentheses",
"No Expression Present",
"Division by Zero"
};

throw new ParserException(err[error]);
}

// Obtain the next token.
private void getToken()
{
tokType = NONE;
token = "";

// Check for end of expression.
if(expIdx == exp.length()) {
token = EOE;
return;
}

// Skip over white space.
while(expIdx < exp.length() &&
Character.isWhitespace(exp.charAt(expIdx))) ++expIdx;

// Trailing whitespace ends expression.
if(expIdx == exp.length()) {
token = EOE;
return;
}

if(isDelim(exp.charAt(expIdx))) { // is operator
token += exp.charAt(expIdx);
expIdx++;
tokType = DELIMITER;
}
else if(Character.isLetter(exp.charAt(expIdx))) { // is variable
while(!isDelim(exp.charAt(expIdx))) {
token += exp.charAt(expIdx);
expIdx++;
if(expIdx >= exp.length()) break;
}
tokType = VARIABLE;
}
else if(Character.isDigit(exp.charAt(expIdx))) { // is number
while(!isDelim(exp.charAt(expIdx))) {
token += exp.charAt(expIdx);
expIdx++;
if(expIdx >= exp.length()) break;
}
tokType = NUMBER;
}
else { // unknown character terminates expression
token = EOE;
return;
}
}

// Return true if c is a delimiter.
private boolean isDelim(char c)
{
if((" +-/*%^=()".indexOf(c) != -1))
return true;
return false;
}

}


sunyujia 2008-10-11
  • 打赏
  • 举报
回复
我感觉像beanshell Groovy js引擎这类东西的原理和实现都不是常人能够研究的。。。。
呵呵!不研究也罢。
ZangXT 2008-10-11
  • 打赏
  • 举报
回复
表达式分析就用编译原理上的那堆东西吧。
fosjos 2008-10-11
  • 打赏
  • 举报
回复
以前用过多次,就是没有深究其原理,偶也是懒人一个,没这个精力
fosjos 2008-10-11
  • 打赏
  • 举报
回复
借人气一问,

楼上有没有哪位知道beanshell是如何实现eval的?
sunyujia 2008-10-11
  • 打赏
  • 举报
回复
呵呵,攒一个。
加载更多回复(8)
​ 博主介绍:✌在职Java研发工程师、专注于程序设计、源码分享、技术交流、专注于Java技术领域和毕业设计✌项目名称基于Web的酒店客房管理系统的设计与实现系统说明3.2.1  用户模块功能分析前台模块应主要包括用户登录模块、用户注册模块、查看客房信息模块、客房预定 模块、用户留言模块、充模块和个人信息维护模块。用户登录模块:用户通过输入注册的的账号和密码,然后进行身份验证,匹配成功 后实现登录功能。用户注册模块:用户输入合法的账号和密码可以实现注册功能。 查看客房信息模块:用户可以通过首页查看客房的价格,图片,详情等信息,从而   可以选择想要预定的房间。 客房预定模块:用户选择自己想要预定的客房后,可以通过输入相关信息进行订房操作。用户留言模块:用户可以向管理员发送留言。 充模块:用户可以通过添加银行卡再为自己进行充操作。 个人信息维护模块:用户可以修改自己的姓名、密码、身份证号等信息,还可以查看自己的订单。3.2.2  管理员模块功能分析对于管理员而言,一个好的管理系统总是能让酒店的管理工作事半功倍[7]。管理员 能够通过这个系统对自己的酒店情况一目了然,应该包括客户留言模块、客房管理模 块、订房信息管理模块、入住信息管理模块、统计分析模块、酒店新闻管理模块、会 员信息管理模块、员工信息管理模块、系统用户管理模块、个人信息维护模块。客户留言模块:管理员可以查看并回复用户的留言。客房管理模块:管理员可以管理客房信息,可以添加新的客房,删除已经停用的客房信息,还可以修改现有的客房信息。订房信息管理模块:管理员可以处理用户的订房请求,为用户办理入住手续。入住信息管理模块:对于没有注册的线下客户,也可以办理入住手续。统计分析模块:可以对酒店所有的入住信息进行记录和总结分析。酒店新闻管理模块:管理员可以更新网站上的新闻公告,展示图片等信息。会员信息管理模块:管理员可以查看到所有的注册会员信息,可以对会员信息进行删除,修改,添加操作。员工信息管理模块:管理员可以查看到自己公司所有的员工信息,而且还可以对员工的相关信息进行管理。系统用户管理模块:管理员可以查看到所有的系统管理员信息并对管理员信息进行管理。个人信息维护模块:管理员可以更改自己的登录密码或者是姓名、性别、手机号等 相关个人信息。​编辑 环境需要1.运行环境:最好是java jdk 1.8,我们在这个平台上运行的。其他版本理论上也可以。2.IDE环境:IDEA,Eclipse,Myeclipse都可以。推荐IDEA;3.tomcat环境:Tomcat 7.x,8.x,9.x版本均可4.硬件环境:windows 7/8/10 1G内存以上;或者 Mac OS; 5.数据库:MySql 5.7版本;6.是否Maven项目:否;技术栈1. 后端:Spring+SpringMVC+Mybatis2. 前端:JSP+CSS+JavaScript+jQuery使用说明1. 使用Navicat或者其它工具,在mysql中创建对应名称的数据库,并导入项目的sql文件;2. 使用IDEA/Eclipse/MyEclipse导入项目,Eclipse/MyEclipse导入时,若为maven项目请选择maven;若为maven项目,导入成功后请执行maven clean;maven install命令,然后运行;3. 将项目中springmvc-servlet.xml配置文件中的数据库配置改为自己的配置;4. 运行项目,在浏览器中输入http://localhost:8080/ 登录运行截图​编辑​编辑​编辑​编辑​编辑​编辑​编辑​编辑​编辑​编辑​编辑​编辑​编辑​编辑​编辑 用户管理控制层:package com.houserss.controller;import javax.servlet.http.HttpSession;import org.apache.commons.lang3.StringUtils;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestMethod;import org.springframework.web.bind.annotation.RequestParam;import org.springframework.web.bind.annotation.ResponseBody;import com.houserss.common.Const;import com.houserss.common.Const.Role;import com.houserss.common.ServerResponse;import com.houserss.pojo.User;import com.houserss.service.IUserService;import com.houserss.service.impl.UserServiceImpl;import com.houserss.util.MD5Util;import com.houserss.util.TimeUtils;import com.houserss.vo.DeleteHouseVo;import com.houserss.vo.PageInfoVo;/** * Created by admin */@Controller@RequestMapping(/user/)public class UserController if (ip != null && ip.length() > 0) String[] ips = ip.split(,);for (int i = 0; i  

81,091

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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