「java类似eval」Java类似nrm工具

博主:adminadmin 2022-11-26 01:03:09 74

本篇文章给大家谈谈java类似eval,以及Java类似nrm工具对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

java里面有没有类似JavaScript中的evel函数的方法

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=0;inCount;){

nTemp=0;

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

isFun=false;

temp1="";

while(inCount){

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

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

nFun++;

isFun=true;

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

nFun--;

}

}

if((nFun0)||((!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(nTemp0){

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(nInnOut){

String ret="";

value1=Values.pop().toString();

value2=Values.pop().toString();

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

Values.push(ret);

} else if(nInnOut){

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(dbValue1dbValue2)

return 1;

else

return 0;

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

if(dbValue1dbValue2)

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(dbValue10||dbValue20)

return 1;

else

return 0;

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

if(dbValue10dbValue20)

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+11*5+2=2";

//String exp="sin(ceil(sqrt(100)))*29+20+30*3+0|0|1+11*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);

}

}

}

Java中有没有类似于eval()的函数?目的是计算一个字符串类型的数学表达式的值

有啊,脚本引擎

public class Test {

public static void main(String[] args) throws ScriptException {

ScriptEngineManager manager = new ScriptEngineManager();

ScriptEngine se = manager.getEngineByName("js");

String str = "1+2*(3+6)-5/2";

Double result =(Double) se.eval(str);

System.out.println(result);

}

}

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

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

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

返回的obj就是一个json对象

Java求助:如何判断某对象是否存在?如果不存在,创建该对象

java中没有类似js的eval功能。很难实现,为何不换个逻辑来做呢?

java eval是甚么表达式都能计算的?

eval()应当是javascript的函数,是把字符串转成表达式.通经常使用于动态产生表达式.不过不推荐使用,如果能用其它方法实现,就不要用,存在兼容问题,也有可能致使不可预测的结果.至于你说的甚么表达式能计算,经常使用的都没问题,不知道你要用到甚么?如果比较特殊,你可以写个小程序试试不就知道结果了.如果要在java中实现这个功能,要用1些特殊办法.不能直接使用.要末自己写函数,要末用第3方的API.由于这个方法不是java标准API中的.

关于java类似eval和Java类似nrm工具的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。

The End

发布于:2022-11-26,除非注明,否则均为首码项目网原创文章,转载请注明出处。