62,634
社区成员




/**
* 计算入口
*
* @param numModel
* 算式
* @return 结果
*/
public double doAccount(String numModel) {
try {
int eIndex = numModel.indexOf(")");
int bIndex = numModel.lastIndexOf("(",eIndex);
if(eIndex != -1 && bIndex == -1){
throw new Exception("算式格式不正确!!");
} else if(eIndex == -1 && bIndex != -1) {
throw new Exception("算式格式不正确!!");
}
String segment = numModel.substring(bIndex, eIndex+1);
String tempSegment = segment.replace("(", "").replace(")","");
double tResult = account(tempSegment);
numModel = numModel.replace(segment,String.valueOf(tResult));
if(numModel.indexOf(")") != -1){
return doAccount(numModel);
}
DecimalFormat format = new DecimalFormat("0.##");
return Double.parseDouble(format.format(account(numModel)));
} catch (Exception ex) {
ex.printStackTrace();
}
return 0.0;
}
String numModel = "1 + (2 * (3 + 4) * 5)";
import java.text.DecimalFormat;
import java.util.HashMap;
import java.util.Map;
import java.util.Stack;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Arithmetic {
public Arithmetic() {
}
/* 操作区 */
private double operation(double n1, double n2, String expression) {
if (expression.equals("+")) {
return n1 + n2;
} else if (expression.equals("-")) {
return n1 - n2;
} else if (expression.equals("*")) {
return n1 * n2;
} else if (expression.equals("/")) {
return n1 / n2;
}
return 0;
}
/* 优先级 */
private int priority(String expression) {
if (expression != null && !expression.trim().equals("")) {
if (expression.equals("+") || expression.equals("-")) {
return 0;
} else if (expression.equals("*") || expression.equals("/")) {
return 1;
}
}
return -1;
}
/**
* 判断是否为一个算数运算符
*
* @param expression
* 算式运算符
* @return
*/
private boolean isExpression(String expression) {
return expression != null
&& !expression.trim().equals("")
&& (expression.equals("+") || expression.equals("-")
|| expression.equals("*") || expression.equals("/"));
}
/**
* 计算入口
*
* @param numModel
* 算式
* @return 结果
*/
public double doAccount(String numModel) {
try {
int endIndex = 0;
int startIndex = numModel.indexOf("(", endIndex);
while (startIndex != -1) {
endIndex = numModel.indexOf(")", startIndex) + 1;
String segment = numModel.substring(startIndex, endIndex);
double tResult = account(segment.replace("(", "").replace(")",
""));
numModel = numModel.replace(segment, String.valueOf(tResult));
startIndex = numModel.indexOf("(", 0);
}
DecimalFormat format = new DecimalFormat("0.##");
return Double.parseDouble(format.format(account(numModel)));
} catch (Exception ex) {
ex.printStackTrace();
}
return 0.0;
}
/**
* 核心算法逻辑
*
* @param numModel
* 算式
* @return
*/
@SuppressWarnings("unchecked")
private double account(String numModel) throws Exception {
try{
return Double.parseDouble(numModel);
} catch (NumberFormatException ex){}
String operators[] = {"[.0-9]\\+","[.0-9]\\-", "\\*", "\\/", "\\(", "\\)" };
for (int i = 0; i < operators.length; i++) {
if(i == 0 || i == 1){
Pattern pa = Pattern.compile(operators[i]);
Matcher mt = pa.matcher(numModel);
while(mt.find()){
StringBuffer sb = new StringBuffer(mt.group());
sb.insert(1," ");
sb.append(" ");
numModel = numModel.replaceAll(operators[i],sb.toString());
}
} else {
numModel = numModel.replaceAll(operators[i]," "+operators[i]+" ");
}
}
Stack operStack = new Stack();
String numModels[] = numModel.split("\\s+");
String preEle = "";
for (int i = 0; i < numModels.length; i++) {
if (isExpression(numModels[i])) {
if (preEle == null || preEle.equals("")) {
preEle = numModels[i];
} else {
if (priority(preEle) >= priority(numModels[i])) {
double d1 = Double.parseDouble(String.valueOf(operStack
.pop()));
double d2 = Double.parseDouble(String.valueOf(operStack
.pop()));
operStack.push(operation(d2, d1, preEle));
preEle = numModels[i];
} else if (priority(preEle) < priority(numModels[i])) {
double d1 = Double.parseDouble(String.valueOf(operStack
.pop()));
double d2 = Double.parseDouble(numModels[i + 1]);
operStack.push(operation(d1, d2, numModels[i]));
i++;
}
}
} else {
operStack.push(numModels[i]);
}
}
double d1 = Double.parseDouble(String.valueOf(operStack.pop()));
double d2 = Double.parseDouble(String.valueOf(operStack.pop()));
return operation(d2, d1, preEle);
}
/**
* @param args
*/
public static void main(String[] args) {
String numModel = "-1+(+1)-(+1*10)";
System.out.println(new Arithmetic().doAccount(numModel));
}
import bsh.EvalError;
import bsh.Interpreter;
public class Test {
public static void main(String[] args) throws EvalError {
double result = eval("111.1 * (2 - 1) + (2 - 1) + 50 - 10 * (12 + 3)");
System.out.println(result);
Interpreter bsh = new Interpreter();
String expr = "int i = 5; j = 6";
bsh.eval(expr);
System.out.println("i = " + bsh.get("i"));
System.out.println("j = " + bsh.get("j"));
}
private static double eval(String expression) throws EvalError {
Interpreter bsh = new Interpreter();
Number result = (Number)bsh.eval(expression);
return result.doubleValue();
}
}