java中有没有像js的eval一样的函数

JavaScript023

java中有没有像js的eval一样的函数,第1张

这个必须有的... 当然不全一样 对于eval解析json的...

net.sf.json.JSONObject obj = net.sf.json.JSONObject.fromObject(jsonStr)

返回的obj就是一个json对象

package mathTools

/**

* Eval.java

*

* Created on 2006年4月10日, 下午3:46

*

* To change this template, choose Tools | Template Manager

* and open the template in the editor.

*

* 支持运算符:+ - * / % > < ] [ ! | & =

* 其中:

* ] 表示大于等于

* [ 表示小于等于

* ! 表示不等于

* | 表示或

* & 表示与

* = 表示是否等于

*

* 支持函数:sqrt,square,ceil,sin,cos,asin,acon.tan.atan,log,exp 具体含义见 calFunction 代码

*

*/

/**

*

* @author Trumplet

*

*/

import java.util.Stack

import java.util.regex.Matcher

import java.util.regex.Pattern

public class Eval{

public static String OPTS="+-*/%><][!|&=#"

public Object calculate(String expression) throws ExpressionException{

try {

Stack Opts=new Stack()

Stack Values=new Stack()

String exp=expression+"#"

int nCount=exp.length(),nIn,nOut,nTemp

Opts.push("#")

String temp="",optOut="",optIn="",value1="",value2="",optTemp="",opt="",temp1=""

int nFun=0

boolean isFun=false

for(int i=0i<nCount){

nTemp=0

opt=exp.substring(i,i+1)

isFun=false

temp1=""

while(i<nCount){

if(!temp1.equals("")){

if(opt.equals("(")){

nFun++

isFun=true

} else if(opt.equals(")")){

nFun--

}

}

if((nFun>0)||((!isFun)&&this.isValue(opt))){

temp1+=opt

nTemp++

opt=exp.substring(i+nTemp,i+nTemp+1)

} else{

if(isFun){

temp1+=opt

nTemp++

}

break

}

}

if(temp1.equals("")){

temp=opt

} else{

temp=temp1

}

if(nTemp>0){

i=i+nTemp-1

}

temp=temp.trim()

if(this.isValue(temp)){

temp=this.getValue(temp)

Values.push(temp)

i++

} else{

optIn=Opts.pop().toString()

nIn=this.getOptPriorityIn(optIn)

nOut=this.getOptPriorityOut(temp)

if(nIn==nOut){

i++

} else if(nIn>nOut){

String ret=""

value1=Values.pop().toString()

value2=Values.pop().toString()

ret=String.valueOf(this.calValue(value2,optIn,value1))

Values.push(ret)

} else if(nIn<nOut){

Opts.push(optIn)

Opts.push(temp)

i++

}

}

}

return Values.pop()

} catch(ExpressionException eE) {

throw eE

} catch(Exception e) {

throw new ExpressionException("表达式"+expression+"格式非法!")

}

}

protected int getOptPriorityOut(String opt)throws ExpressionException{

if(opt.equals("+")){

return 1

} else if(opt.equals("-")){

return 2

} else if(opt.equals("*")){

return 5

} else if(opt.equals("/")){

return 6

} else if(opt.equals("%")){

return 7

} else if(opt.equals(">")){

return 11

} else if(opt.equals("<")){

return 12

} else if(opt.equals("]")){

return 13

} else if(opt.equals("[")){

return 14

} else if(opt.equals("!")){

return 15

} else if(opt.equals("|")){

return 16

} else if(opt.equals("&")) {

return 23

} else if(opt.equals("=")) {

return 25

} else if(opt.equals("#")) {

return 0

} else if(opt.equals("(")){

return 1000

} else if(opt.equals(")")){

return -1000

}

throw new ExpressionException("运算符"+opt+"非法!")

}

protected int getOptPriorityIn(String opt) throws ExpressionException{

if(opt.equals("+")){

return 3

} else if(opt.equals("-")){

return 4

} else if(opt.equals("*")){

return 8

} else if(opt.equals("/")){

return 9

} else if(opt.equals("%")){

return 10

} else if(opt.equals(">")){

return 17

} else if(opt.equals("<")){

return 18

} else if(opt.equals("]")){

return 19

} else if(opt.equals("[")){

return 20

} else if(opt.equals("!")){

return 21

} else if(opt.equals("|")){

return 22

} else if(opt.equals("&")) {

return 24

} else if(opt.equals("=")) {

return 26

} else if(opt.equals("(")){

return -1000

} else if(opt.equals(")")){

return 1000

} else if(opt.equals("#")){

return 0

}

throw new ExpressionException("运算符"+opt+"非法!")

}

protected String getOPTS() {

return OPTS

}

protected boolean isValue(String cValue){

String notValue=this.getOPTS()+"()"

return notValue.indexOf(cValue)==-1

}

protected boolean isOpt(String value){

return this.getOPTS().indexOf(value)>=0

}

protected double calValue(String value1,String opt,String value2) throws ExpressionException{

try {

double dbValue1=Double.valueOf(value1).doubleValue()

double dbValue2=Double.valueOf(value2).doubleValue()

long lg=0

if(opt.equals("+")){

return dbValue1+dbValue2

} else if(opt.equals("-")){

return dbValue1-dbValue2

} else if(opt.equals("*")){

return dbValue1*dbValue2

} else if(opt.equals("/")){

return dbValue1/dbValue2

} else if(opt.equals("%")){

lg=(long)(dbValue1/dbValue2)

return dbValue1-lg*dbValue2

} else if(opt.equals(">")){

if(dbValue1>dbValue2)

return 1

else

return 0

} else if(opt.equals("<")){

if(dbValue1<dbValue2)

return 1

else

return 0

} else if(opt.equals("]")){

if(dbValue1>=dbValue2)

return 1

else

return 0

} else if(opt.equals("[")){

if(dbValue1<=dbValue2)

return 1

else

return 0

} else if(opt.equals("!")){

if(dbValue1!=dbValue2)

return 1

else

return 0

} else if(opt.equals("|")){

if(dbValue1>0||dbValue2>0)

return 1

else

return 0

} else if(opt.equals("&")){

if(dbValue1>0&&dbValue2>0)

return 1

else

return 0

} else if(opt.equals("=")){

if(dbValue1==dbValue2)

return 1

else

return 0

}

}catch(Exception e) {

throw new ExpressionException("值"+value1+"或"+value2+"在进行"+ opt+"运算时非法!")

}

throw new ExpressionException("运算符"+opt+"非法!")

}

protected String getValue(String oldValue) throws ExpressionException{

String reg="^([a-zA-Z0-9_]+)\\(([a-zA-Z0-9_.()]+)\\)$"

if(this.isFunctionCal(oldValue)){

Pattern p=Pattern.compile(reg)

Matcher m=p.matcher(oldValue)

m.find()

return calFunction(m.group(1),m.group(2))

}

return oldValue

}

protected boolean isFunctionCal(String value){

String reg="^([a-zA-Z0-9_]+)\\(([a-zA-Z0-9_.()]+)\\)$"

return value.matches(reg)

}

protected String calFunction(String function,String value) throws ExpressionException{

String lowerFun=function.toLowerCase()

double db=0

try {

db=Double.valueOf(this.getValue(value)).doubleValue()

if(lowerFun.equals("log")){

return String.valueOf(Math.log(db))

} else if(lowerFun.equals("square")){

return String.valueOf(Math.pow(db,2))

} else if(lowerFun.equals("sqrt")){

return String.valueOf(Math.sqrt(db))

} else if(lowerFun.equals("sin")){

return String.valueOf(Math.sin(db))

} else if(lowerFun.equals("asin")){

return String.valueOf(Math.asin(db))

} else if(lowerFun.equals("cos")){

return String.valueOf(Math.cos(db))

} else if(lowerFun.equals("tan")){

return String.valueOf(Math.tan(db))

} else if(lowerFun.equals("atan")){

return String.valueOf(Math.atan(db))

} else if(lowerFun.equals("ceil")){

return String.valueOf(Math.ceil(db))

} else if(lowerFun.equals("exp")){

return String.valueOf(Math.exp(db))

}

}catch(Exception e) {

throw new ExpressionException("函数"+function+"值"+value+"非法!")

}

throw new ExpressionException("函数"+function+"不支持!")

}

public static void main(String[]args) {

Eval be=new Eval()

//String exp="sin(ceil(100))*29+20+30*3+0|0|1+1&1*5+2=2"

//String exp="sin(ceil(sqrt(100)))*29+20+30*3+0|0|1+1&1*5+2=2"

String exp="8/(3-8/3)"

try {

System.out.println(be.calculate(exp))

} catch(ExpressionException eE) {

System.out.println(eE.getMessage())

}

}

//表达式异常类代码:

public class ExpressionException extends Exception{

public ExpressionException(String msg) {

super(msg)

}

}

}