博主前面写的一篇博文微信小程序(看文档写实例一)微信小程序计算器实例中,四则运算那个,有同学说有Bug,于是用20分钟用Java写了一个方法,当然由于没有用逆波兰表达式,没有考虑()以及乘数带负号,如果考虑()以及乘数带负号那么就要用栈和逆波兰表达式的中缀和后缀式了,不过这没有给,只是给前面的同学提供一个参考。
思路很简单,按+-×÷分割,+分割完给-分割然后给×最后给÷分割,如果分割+后有-就算-,有×就算×,有÷就算÷,直到结果。这里有个值得注意的小问题,就是在-的时间,前面有负号和没有负号,如果有-号,分割后第一个索引是没有值的,由于第一位是负号,于是算第一个数要取反,后面就是都是减了,代码很简单如下:
public static double cal_add(String s){
if(s.length()==0||s == null)return 0;
double sum = 0;
String []adds = s.split("\\+");
for(int i=0;i<adds.length;i++){
if(adds[i].equals(""))continue;
if(adds[i].contains("-")) sum += cal_sub(adds[i]);
else if(adds[i].contains("×")) sum += cal_m(adds[i]);
else if(adds[i].contains("÷")) sum += cal_d(adds[i]);
else sum +=Double.parseDouble(adds[i]);
}
return sum;
}
public static double cal_sub(String s){
if(s.length()==0||s == null)return 0;
double sum = 0;
String []subs = s.split("-");
for(int i=0;i<subs.length;i++){
if(i == 0) {
if (!subs[i].equals("")) {
if(subs[i].contains("×")) sum += cal_m(subs[i]);
else if(subs[i].contains("÷")) sum += cal_d(subs[i]);
else sum += Double.parseDouble(subs[i]);
}
}
else{
if(subs[i].contains("×")) sum += -cal_m(subs[i]);
else if(subs[i].contains("÷")) sum += -cal_d(subs[i]);
else sum += -Double.parseDouble(subs[i]);
}
}
return sum;
}
public static double cal_m(String s){
if(s.length()==0||s == null)return 0;
double sum = 1;
String []ms = s.split("×");
for(int i=0;i<ms.length;i++){
if(ms[i].contains("÷")) sum *= cal_d(ms[i]);
else sum *= Double.parseDouble(ms[i]);
}
return sum;
}
public static double cal_d(String s){
if(s.length()==0||s == null)return 0;
double sum = 1;
String []cs = s.split("÷");
for(int i=0;i<cs.length;i++){
if(i == 0) sum *= Double.parseDouble(cs[i]);
else sum /= Double.parseDouble(cs[i]);
}
return sum;
}
结果:
System.out.println(cal_add("8+7÷2+5×3-6÷2"));