public static void main(String[] args) {
String formula = "(((2*3+1+8)*5+1)/2)";
// String equalationLeft = formula.split("=")[0];
// String equalationRight = formula.split("=")[1];
/** 获取变量表: **/
// getVarList(equalationRight);
/** 代回公式进行替换 **/
String newFormula = replaceEquation(formula);
/** 进行计算 **/
System.out.println("newFormula======="+newFormula);
float result = calc(newFormula);
System.out.println("最终结果:" + result);
}
这是测试的主程序,我传入的公式为 ((2*3+1+8)*5+1)/2 但是在表达式中的formula变量必须还要再加一层括号。具体计算的方法为 calc(newFormula),直接将公式传入,调取以后方法:
/** 进行计算 **/
private static float calc(String newFormula) {
boolean stillHaveCalcSymbol = false;
do{
//System.out.println("before:" + newFormula);
/** 寻找最后一个左括号里面到第一个右括号里面1的内容 **/
char formulaArray[] = newFormula.toCharArray();
for (int i = 0; i < formulaArray.length; i++) {
if (formulaArray[i] == '+' || formulaArray[i] == '-'
|| formulaArray[i] == '*' || formulaArray[i] == '/'
|| formulaArray[i] == '(' || formulaArray[i] == ')') {
stillHaveCalcSymbol = true;
} else {
stillHaveCalcSymbol = false;
}
}
if (stillHaveCalcSymbol) {
String resultFormula = "";
//找最内层的括号里面的内容出来(含括号)
for (int i = 0; i < formulaArray.length; i++) {
if (formulaArray[i] == ')') {
int begin = 0;
for (int j = i; j >= 0; j--) {
if (formulaArray[j] == '(') {
begin = j;
break;
}
}
//以上面得到的开始位置和结束位置为准,截取中间内容
String calcString = newFormula.substring(begin, i + 1);
resultFormula = newFormula.replace(calcString, calcProc(calcString) + "");
//System.out.println(calcString);
break;
}
}
newFormula = resultFormula;
}
} while(stillHaveCalcSymbol);
//最后得到普通的顺序无括号公式:
System.out.println("*********==="+newFormula);
//最后一次计算:
float result = calcProc("(" + newFormula + ")");
return result;
}
/**详细计算过程**/
private static float calcProc(String calcString) {
// if(calcString.contains("=")){
// calcString = calcString.split("=")[1];
// }
//calcString = calcString.replace("(", "");
//calcString = calcString.replace(")", "");
String calcSymbol[] = {"\\*", "\\/", "\\+", "\\-"};
char calcSymbolChar[] = {'*', '/', '+', '-'};
boolean haveSymbol = true;
float result = 0f;
while(haveSymbol){
System.out.println("calcStr:" + calcString);
char calcCharArr[] = calcString.toCharArray();
result = 0f;
for (int i = 0; i < calcSymbol.length; i++) {
boolean alreadyFind = false;
for(int j = 0; j < calcCharArr.length; j++){
if(calcCharArr[j] == calcSymbolChar[i]){
//System.out.println("找到了" + calcSymbolChar[i]);
//以符号为中心,以左右两边的其他符号为边界找到两边的数
float num1 = 0f;
float num2 = 0f;
int bottom = 0;
for(int k = j - 1; k >= 0 && (calcCharArr[k] >= '0' && calcCharArr[k] <= '9' || calcCharArr[k] == '.') ; k--){
//System.out.println(calcCharArr[k] + "");
bottom = k;
}
//System.out.println("[j, bottom]:" + String.format("[%d, %d]", j, bottom));
num1 = Float.valueOf(calcString.substring(bottom, j));
System.out.println("num1:" + num1);
int top = 0;
for(int k = j + 1; k < calcString.length() && (calcCharArr[k] >= '0' && calcCharArr[k] <= '9' || calcCharArr[k] == '.'); k++){
top = k;
}
num2 = Float.valueOf(calcString.substring(j + 1, top + 1));
System.out.println("num2:" + num2);
switch(calcSymbolChar[i]){
case '*':
result = num1 * num2;
break;
case '/':
result = num1 / num2;
break;
case '+':
result = num1 + num2;
break;
case '-':
result = num1 - num2;
break;
}
//System.out.println("bottom to top:" + calcString.substring(bottom + 1, top + 1));
calcString = calcString.replace(calcString.substring(bottom, top + 1), String.format("%.5f", result));
//System.out.println("end_calcStr:" + calcString);
alreadyFind = true;
break;
}
}
if(alreadyFind) break;
}
haveSymbol = false;
if(calcString.contains("*") || calcString.contains("/") || calcString.contains("+") || calcString.contains("-")){
haveSymbol = true;
//System.out.println("找到");
} else {
//System.out.println("找不到");
}
}
//System.out.println("result:" + result);
return result;
}
直接将方法粘到一个新类中(记得整理一下代码,这样有点乱),用的时候直接调用