字符串如何转化成运算式?????????? 如String s="60*10"怎么把这个字符串运算出来??? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 我自己搞的个方法就是:select 60*10 as value from dual这个方法从数据库取value的值,但是数据库提示是不能内部转换,这是啥意思咧 需要自行解析表达式,将其转换成后缀表达式,再使用栈进行计算,如果采用JDK1.6版本的话,可以采用JavaScript脚本的的eval函数。 有没有在java中的简单一点的方法>关键是没时间去搞编译原理的东西了..... 用 script languate JDK 6.0 开始内置支持! 如果格式规则的字符串可以这样截取String[] func = str.split(",");然后自己拼成计算试 我晕,今天怎么了,老在细节上出错,修改上面的回复String[] func = str.split("*"); 这是前段时间写的一个表达式计算的方法package com.hd.fa.util.depreciation;import java.util.HashMap;import com.hd.util.bean.DynaBean;/** * 把正常的表达式转换成逆波兰式 * 并工具系统的特点,计算折旧类型对应的折旧额 * */public class Depr { /** * 原表达式 */ private String exp; /** * 用来存放一个原表达式中的一个一个的值 */ private String token; /** * 零时变量存放表达式中光标的位置 */ private int expIdx; /** * 转换成逆波兰式后的字符串 */ private String expR; /** * 把逆波兰式的字符串顺序压栈的栈的对象 */ private Stack expStack; /** * 设备的信息的bean; */ private DynaBean bean; /** * 折旧表达式对应的逆波兰式 */ private static HashMap regularMap; /** * error 编码 */ private static final int SYNERR = 0; /** * 没有结束 */ private static final int UNBPAREN = 1; /** * 其他 */ private static final int NOEXP = 2; /** * 表达式的结束符 */ private static final String EOE = "\0"; /** * 表达式中的分隔符 */ private static final String SEPERATOR = ","; /** * 处理错误信息 * * @param err 错误编码 * @throws RpnException 错误的类 */ public void handleErr(int err) throws RpnException { String[] errs = new String[]{"SYNTAX ERROR", "UNBALANCE PARENTHESE", "NO EXPRESSSION" }; throw new RpnException(errs[err]); } /** * 判断字串是否是一个运算符号 * @param a 需要判断的字符 * @return boolean 如果是则返回true */ private boolean isDelim(char a) { if (" +-*%/()".indexOf(a) != -1) { return true; } return false; } /** * 得到原表达式中的下一个元素 */ private void getToken() { token = ""; if (expIdx == exp.length()) { token = EOE; return; } // If there is white space in expression while (expIdx < exp.length() && Character.isWhitespace(exp.charAt(expIdx))) { ++expIdx; } if (expIdx == exp.length()) { token = EOE; return; } if (Character.isDigit(exp.charAt(expIdx))) { while (expIdx < exp.length() && Character.isDigit(exp.charAt(expIdx))) { token = token + exp.charAt(expIdx); expIdx++; } } else if (isDelim(exp.charAt(expIdx))) { token = token + exp.charAt(expIdx); expIdx++; } else if (Character.isLetterOrDigit(exp.charAt(expIdx))) { while (expIdx < exp.length() && Character.isLetter(exp.charAt(expIdx))) { token = token + exp.charAt(expIdx); expIdx++; } } } /** * 程序的入口,根据表达式和传过来的bean来计算折旧的值 * @param assetBean 需要折旧的资产的记录 * @return double 该资产当月的折旧费用 * @throws RpnException 异常 */ public double getResult(DynaBean assetBean) throws RpnException { exp = getRegularOfDep(assetBean.getStr("DEPRTYPE")); this.bean = assetBean; if (regularMap == null) { regularMap = new HashMap(); } if (regularMap.containsKey(exp)) { expR = (String) regularMap.get(exp); } else { expIdx = 0; getToken(); if (token.length() == 0) { handleErr(NOEXP); } expR = convert(); if (!token.equals(EOE)) { handleErr(SYNERR); } regularMap.put(exp, this.expR); } this.putStringIntoStack(); return this.calculate(); } /** * 得到各种折旧类型对应的折旧公式 * @param type * 设备的折旧类型 * @return boolean * 如果审核成功则返回true,否则返回false */ private String getRegularOfDep(String type) { return "(FORMERCOST-DEPRTOTAL-FINALCOST-TOTALREDUCE+RETURNREDUCE)/(ASLIFE*12-DEPREDMONTH)" .replaceAll("ASLIFE", "(ASLIFE/12)"); } /** * 处理 '+' 和 '-' 的操作 * @return String 返回处理后的表达式 * @throws RpnException 异常 */ private String convert() throws RpnException { String result = ""; char op; result = convert2(); while ((op = token.charAt(0)) == '+' || op == '-') { getToken(); String partialResult = convert2(); result = result + SEPERATOR + partialResult + SEPERATOR + op; } return result; } /** * 处理 '*' 和 '/' 和 '%' 的操作 * @return String 返回处理后的表达式 * @throws RpnException 异常 */ private String convert2() throws RpnException { String result = ""; char op; result = convert3(); while ((op = token.charAt(0)) == '*' || op == '/' || op == '%') { getToken(); String partialResult = convert3(); result = result + SEPERATOR + partialResult + SEPERATOR + op; } return result; } /** * 处理 () 的操作 * @return String 返回处理后的表达式 * @throws RpnException 异常 */ private String convert3() throws RpnException { String result = ""; if (token.charAt(0) == '(') { getToken(); result = convert(); if (token.charAt(0) != ')') { handleErr(UNBPAREN); } } else { result = token; } getToken(); return result; } /** * 把生产的逆波兰式字串放入到栈中,便于计算 */ private void putStringIntoStack() { String[] list = this.expR.split(","); expStack = new Stack(); for (int i = 0; i < list.length; i++) { if (!list[i].equals("")) { expStack.push(list[i]); } } } /** * 根据表达式计算折旧费用 * @return double 折旧费用 */ private double calculate() { String temp = (String) expStack.pop(); if (temp.equals("+")) { double temp1 = calculate(); double temp2 = calculate(); return temp2 + temp1; } else if (temp.equals("-")) { double temp1 = calculate(); double temp2 = calculate(); return temp2 - temp1; } else if (temp.equals("*")) { double temp1 = calculate(); double temp2 = calculate(); return temp2 * temp1; } else if (temp.equals("/")) { double temp1 = calculate(); double temp2 = calculate(); return temp2 / temp1; } else { //这里你只是用到了数字,没有用到表达式 就直接返回数字 if (isNumber(temp)) { return Double.parseDouble(temp); } else { return bean.getDouble(temp); } } } /** * 判断一个字串是否是一个数字 * @param str 需要判断的字串 * @return boolean 如果是数字类型则返回true */ private boolean isNumber(String str) { return str.matches("[+-]?[\\d]+[.]?[\\d]+"); }} package com.hd.fa.util.depreciation;import java.util.ArrayList;/** * 利用list构造一个栈 * @author zdj */public class Stack { /** * 存放数据的list */ private ArrayList l = new ArrayList(); /** * 栈的原始长度 */ private int length = 0; /** * 出栈操作 * @return Object 栈顶的元素 */ public Object pop() { Object temp = l.get(0); length--; l.remove(0); return temp; } /** * 压栈操作 * @param a 栈顶的元素 */ public void push(Object a) { l.add(0, a); length++; } /** * 取得栈的长度 * @return int 栈的长度 */ public int size() { return length; }} Java 图片缩放处理,JMagick问题 怎么获取Byte每个Bit位数据 java 数字文字这个怎么理解呢? 我用jdk1.6.0_03 编译时,出现 -Xlint:deprecation 错误 ImageIcon类的问题!请教! 高手快进来!!! 关于文本输入框 面对对象简单题目,大家帮我看看 byte数组转short值不对啊 请问哪有JBUILDER 或 VISUAL J++下载!在线等! 如何实现JTable第一列不随滚动条滚动?? 有得振得睡用java怎么做
select 60*10 as value from dual
这个方法从数据库取value的值,但是数据库提示是不能内部转换,这是啥意思咧
可以采用JavaScript脚本的的eval函数。
String[] func = str.split(",");
然后自己拼成计算试
String[] func = str.split("*");
* 把正常的表达式转换成逆波兰式
* 并工具系统的特点,计算折旧类型对应的折旧额
*
*/
public class Depr { /**
* 原表达式
*/
private String exp;
/**
* 用来存放一个原表达式中的一个一个的值
*/
private String token; /**
* 零时变量存放表达式中光标的位置
*/
private int expIdx; /**
* 转换成逆波兰式后的字符串
*/
private String expR; /**
* 把逆波兰式的字符串顺序压栈的栈的对象
*/
private Stack expStack; /**
* 设备的信息的bean;
*/
private DynaBean bean; /**
* 折旧表达式对应的逆波兰式
*/
private static HashMap regularMap; /**
* error 编码
*/
private static final int SYNERR = 0; /**
* 没有结束
*/
private static final int UNBPAREN = 1; /**
* 其他
*/
private static final int NOEXP = 2; /**
* 表达式的结束符
*/
private static final String EOE = "\0"; /**
* 表达式中的分隔符
*/
private static final String SEPERATOR = ",";
/**
* 处理错误信息
*
* @param err 错误编码
* @throws RpnException 错误的类
*/
public void handleErr(int err) throws RpnException {
String[] errs = new String[]{"SYNTAX ERROR", "UNBALANCE PARENTHESE", "NO EXPRESSSION" };
throw new RpnException(errs[err]);
} /**
* 判断字串是否是一个运算符号
* @param a 需要判断的字符
* @return boolean 如果是则返回true
*/
private boolean isDelim(char a) {
if (" +-*%/()".indexOf(a) != -1) {
return true;
}
return false;
} /**
* 得到原表达式中的下一个元素
*/
private void getToken() {
token = ""; if (expIdx == exp.length()) {
token = EOE;
return;
} // If there is white space in expression
while (expIdx < exp.length()
&& Character.isWhitespace(exp.charAt(expIdx))) {
++expIdx;
}
if (expIdx == exp.length()) {
token = EOE;
return;
} if (Character.isDigit(exp.charAt(expIdx))) {
while (expIdx < exp.length()
&& Character.isDigit(exp.charAt(expIdx))) {
token = token + exp.charAt(expIdx);
expIdx++;
}
} else if (isDelim(exp.charAt(expIdx))) {
token = token + exp.charAt(expIdx);
expIdx++;
} else if (Character.isLetterOrDigit(exp.charAt(expIdx))) {
while (expIdx < exp.length()
&& Character.isLetter(exp.charAt(expIdx))) {
token = token + exp.charAt(expIdx);
expIdx++;
}
}
} /**
* 程序的入口,根据表达式和传过来的bean来计算折旧的值
* @param assetBean 需要折旧的资产的记录
* @return double 该资产当月的折旧费用
* @throws RpnException 异常
*/
public double getResult(DynaBean assetBean) throws RpnException {
exp = getRegularOfDep(assetBean.getStr("DEPRTYPE"));
this.bean = assetBean;
if (regularMap == null) {
regularMap = new HashMap();
}
if (regularMap.containsKey(exp)) {
expR = (String) regularMap.get(exp);
} else {
expIdx = 0;
getToken();
if (token.length() == 0) {
handleErr(NOEXP);
} expR = convert(); if (!token.equals(EOE)) {
handleErr(SYNERR);
}
regularMap.put(exp, this.expR);
}
this.putStringIntoStack();
return this.calculate();
} /**
* 得到各种折旧类型对应的折旧公式
* @param type
* 设备的折旧类型
* @return boolean
* 如果审核成功则返回true,否则返回false
*/
private String getRegularOfDep(String type) {
return "(FORMERCOST-DEPRTOTAL-FINALCOST-TOTALREDUCE+RETURNREDUCE)/(ASLIFE*12-DEPREDMONTH)"
.replaceAll("ASLIFE", "(ASLIFE/12)");
}
/**
* 处理 '+' 和 '-' 的操作
* @return String 返回处理后的表达式
* @throws RpnException 异常
*/
private String convert() throws RpnException {
String result = "";
char op; result = convert2(); while ((op = token.charAt(0)) == '+' || op == '-') {
getToken();
String partialResult = convert2();
result = result + SEPERATOR + partialResult + SEPERATOR + op;
}
return result;
} /**
* 处理 '*' 和 '/' 和 '%' 的操作
* @return String 返回处理后的表达式
* @throws RpnException 异常
*/
private String convert2() throws RpnException {
String result = "";
char op; result = convert3(); while ((op = token.charAt(0)) == '*' || op == '/' || op == '%') {
getToken();
String partialResult = convert3();
result = result + SEPERATOR + partialResult + SEPERATOR + op;
}
return result;
} /**
* 处理 () 的操作
* @return String 返回处理后的表达式
* @throws RpnException 异常
*/
private String convert3() throws RpnException {
String result = ""; if (token.charAt(0) == '(') {
getToken();
result = convert();
if (token.charAt(0) != ')') {
handleErr(UNBPAREN);
}
} else {
result = token;
}
getToken();
return result;
} /**
* 把生产的逆波兰式字串放入到栈中,便于计算
*/
private void putStringIntoStack() {
String[] list = this.expR.split(",");
expStack = new Stack();
for (int i = 0; i < list.length; i++) {
if (!list[i].equals("")) {
expStack.push(list[i]);
}
}
}
/**
* 根据表达式计算折旧费用
* @return double 折旧费用
*/
private double calculate() {
String temp = (String) expStack.pop();
if (temp.equals("+")) {
double temp1 = calculate();
double temp2 = calculate();
return temp2 + temp1;
} else if (temp.equals("-")) {
double temp1 = calculate();
double temp2 = calculate();
return temp2 - temp1;
} else if (temp.equals("*")) {
double temp1 = calculate();
double temp2 = calculate();
return temp2 * temp1;
} else if (temp.equals("/")) {
double temp1 = calculate();
double temp2 = calculate();
return temp2 / temp1;
} else {
//这里你只是用到了数字,没有用到表达式 就直接返回数字
if (isNumber(temp)) {
return Double.parseDouble(temp);
} else {
return bean.getDouble(temp);
}
}
}
/**
* 判断一个字串是否是一个数字
* @param str 需要判断的字串
* @return boolean 如果是数字类型则返回true
*/
private boolean isNumber(String str) {
return str.matches("[+-]?[\\d]+[.]?[\\d]+");
}
}
/**
* 利用list构造一个栈
* @author zdj
*/
public class Stack {
/**
* 存放数据的list
*/
private ArrayList l = new ArrayList(); /**
* 栈的原始长度
*/
private int length = 0; /**
* 出栈操作
* @return Object 栈顶的元素
*/
public Object pop() {
Object temp = l.get(0);
length--;
l.remove(0);
return temp;
} /**
* 压栈操作
* @param a 栈顶的元素
*/
public void push(Object a) {
l.add(0, a);
length++;
} /**
* 取得栈的长度
* @return int 栈的长度
*/
public int size() {
return length;
}
}