把内容提取分割,使用了Double类,使用了递归方法
package test.atest;
import java.util.ArrayList;
import java.util.Scanner;
public class Calculator {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("請輸入一個算式,可包含英文小括號() + - * / %");
String s = sc.nextLine();
String result = "";
try {
String s1 = getBrackets(s);
result = getInnerResult(s1);
}catch(IndexOutOfBoundsException e) {
System.out.println("錄入錯誤");
System.exit(0);
}
System.out.println(result);
sc.close();
}
/**
* @Title: getBrackets
* @Description: 获取括号内容
* @param s
* @return
* @author 耿玉星
*/
private static String getBrackets(String s) {
char[] charArray = s.toCharArray();
for (int i = 0; i < charArray.length; i++) {
char c = charArray[i];
if(c == '(') {
String beforeTemp = s.substring(0,i+1);
String temp = s.substring(i+1);
if(temp.indexOf(")") == -1) {
System.out.println("輸入錯誤");
System.exit(0);
}
//正常情況,括號內部沒有別的括號
if(temp.indexOf("(") == -1 || temp.indexOf("(")>temp.indexOf(")")) {
String innerResult = getInnerResult(temp.substring(0,temp.indexOf(")")));
int end = i+temp.indexOf(")")+2;
s = s.substring(0,i)+innerResult+s.substring(end);
String s1 = getBrackets(s);
System.out.println("正常1 :" + s1);
return s1;
}else {
String s1 = getBrackets(temp);
System.out.println("正常2 :" + s1);
return beforeTemp+s1;
}
}else {
continue;
}
}
return s;
}
/**
* @Title: getInnerResult
* @Description: 获取括号内部结果
* @param s
* @param charArray
* @author 耿玉星
*/
private static String getInnerResult(String s) {
char[] charArray = s.toCharArray();
ArrayList<Integer> tempArray = new ArrayList<>();
ArrayList<Double> numArray = new ArrayList<>();
ArrayList<String> nodeArray = new ArrayList<>();
for (int i = 0; i < charArray.length; i++) {
if(!(charArray[i] >= '0' && charArray[i] <= '9')) {
tempArray.add(i);
nodeArray.add(charArray[i]+"");
}
}
//讲字符串变为double
for (int i = 0; i < tempArray.size(); i++) {
if(i == 0) {
numArray.add(Double.valueOf("".equals(s.substring(0,tempArray.get(i)))?"0":s.substring(0,tempArray.get(i))));
}else {
numArray.add(Double.valueOf("".equals(s.substring(tempArray.get(i-1)+1,tempArray.get(i)))?"0":s.substring(tempArray.get(i-1)+1,tempArray.get(i))));
}
if(i == tempArray.size()-1) {
numArray.add(Double.valueOf("".equals(s.substring(tempArray.get(i)+1))?"0":s.substring(tempArray.get(i)+1)));
}
}
for (int i = 0; i < numArray.size(); i++) {
if(numArray.get(i) == 0.0) {
numArray.remove(i);
i--;
}
}
for (int i = 0; i < nodeArray.size(); i++) {
if(".".equals(nodeArray.get(i)) || "(".equals(nodeArray.get(i)) || ")".equals(nodeArray.get(i))) {
nodeArray.remove(i);
i--;
}
}
return getResult(numArray, nodeArray);
}
/**
* @Title: getResult
* @Description: 获取结果
* @param numArray 数字
* @param nodeArray 加减乘除等
* @author 耿玉星
*/
private static String getResult(ArrayList<Double> numArray, ArrayList<String> nodeArray) {
for (int i = 0; i < nodeArray.size(); i++) {
if("*".equals(nodeArray.get(i))) {
double temp = numArray.get(i) * numArray.get(i+1);
i = calculate(numArray, nodeArray, i, temp);
continue;
}
if("/".equals(nodeArray.get(i))) {
if(numArray.get(i+1) == 0) {
System.out.println("格式有誤");
System.exit(0);
}
double temp = numArray.get(i) / numArray.get(i+1);
i = calculate(numArray, nodeArray, i, temp);
continue;
}
if("%".equals(nodeArray.get(i))) {
double temp = numArray.get(i) % numArray.get(i+1);
i = calculate(numArray, nodeArray, i, temp);
continue;
}
}
for (int i = 0; i < nodeArray.size(); i++) {
if("+".equals(nodeArray.get(i))) {
double temp = numArray.get(i) + numArray.get(i+1);
i = calculate(numArray, nodeArray, i, temp);
continue;
}
if("-".equals(nodeArray.get(i))) {
double temp = numArray.get(i) - numArray.get(i+1);
i = calculate(numArray, nodeArray, i, temp);
continue;
}
}
for (Double d : numArray) {
if(d != 0) {
return String.format("%.2f", d);
}
}
return "0.00";
}
/**
* @Title: calculate
* @Description: 删除多余部分
* @param numArray
* @param nodeArray
* @param i
* @param temp
* @return
* @author 耿玉星
*/
private static int calculate(ArrayList<Double> numArray, ArrayList<String> nodeArray, int i, double temp) {
numArray.remove(i+1);
numArray.remove(i);
numArray.add(i,temp);
nodeArray.remove(i);
i--;
return i;
}
}