import java.text.NumberFormat;
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);//控制台输入字符串
System.out.println("注意:计算过程中不能出现负数!");
System.out.println("表达式必须规范!");
System.out.println("请输入你所要计算的算式,回车结束:");
System.out.println("最终结果为:"+getzongde(sc.nextLine()));
}
//最后的去除加减
public static String getzongde(String str){
String kuohao=getkuohao(str);
String chengchu=getchengchu(kuohao);
String jiajian=getjiajian(chengchu);
return jiajian;
}
/**
* 第一步:去括号
* */
public static String getkuohao(String str){
String newstr=str;
if(newstr.contains("(")){
int a=str.lastIndexOf("(");//判断最后一个括号
String str1=str.substring(a,str.length());
int b =str1.indexOf(")");
String str2=str1.substring(1,b);//截取到最后一个括号:1229996*21/23+3
String chengchu=getchengchu(str2);//计算括号里的乘除
String jiajian=getjiajian(chengchu);//计算括号里的加减
StringBuffer s=new StringBuffer(str);
newstr=s.replace(a, a+b+1, jiajian).toString();//置换掉此括号将其换算为数字
System.out.println("去掉括号后得到:"+newstr);
return getkuohao(newstr);//递归寻找下一个括号
}
return newstr;
}
/**
* 去除括号里面的称号除号
* */
public static String getchengchu(String str){
String newstr=str;
if(str.contains("*")||str.contains("/")){//判断是否有乘除运算符
String str2[]=str.split("[*/+-]");//
String str3=str.replaceAll("\\d+","").replaceAll("\\.","");//去除所有数字和小数点获取运算符的串
int a=0,b=0,c=0,star=0;
if(str3.contains("*")&&str3.contains("/")){
//判断如果有乘除都有的话优先计算前一个:1229996*21/23+3 先拿到 * 和 / 的索引
a=str3.indexOf("*");
b=str3.indexOf("/");
// 判断 * / 那个在前面
if(a>b){
c=b;
star=str.indexOf("/");
}else{
c=a;
star=str.indexOf("*");
}
}else if(str3.contains("*")){//如果只有*没有/直接拿到
c=str3.indexOf("*");
star=str.indexOf("*");
}else{
c=str3.indexOf("/");
star=str.indexOf("/");
}
//根据索引 计算公式
String num=getsuanshi(str2[c]+str3.charAt(c)+str2[c+1]);
StringBuffer s=new StringBuffer(str);//转换成buffer类
//计算公式的起始结尾位置
int kaishi=star-str2[c].length(),jieshu=star+str2[c+1].length()+1;
//置换掉算式得到新串
StringBuffer strs=s.replace(kaishi,jieshu ,num);
newstr=strs.toString();
System.out.println(str2[c]+str3.charAt(c)+str2[c+1]+"得到:"+newstr);
return getchengchu(newstr);
}
return newstr;
}
/*
* 去除括号里面的加减号
* */
public static String getjiajian(String str){
String newstr=str;
if(str.contains("+")||str.contains("-")){
String str2[]=str.split("[*/+-]");
String str3=str.replaceAll("\\d+","").replaceAll("\\.","");
int a=0,b=0,c=0,star=0;
if(str3.contains("+")&&str3.contains("-")){
a=str3.indexOf("+");
b=str3.indexOf("-");
if(a>b){
c=b;
star=str.indexOf("-");
}else{
c=a;
star=str.indexOf("+");
}
}else if(str3.contains("+")){
c=str3.indexOf("+");
star=str.indexOf("+");
}else{
c=str3.indexOf("-");
star=str.indexOf("-");
}
String num=getsuanshi(str2[c]+str3.charAt(c)+str2[c+1]);
StringBuffer s=new StringBuffer(str);
int kaishi=star-str2[c].length(),jieshu=star+str2[c+1].length()+1;
StringBuffer strs=s.replace(kaishi,jieshu ,num);
newstr=strs.toString();
System.out.println(str2[c]+str3.charAt(c)+str2[c+1]+"得到:"+newstr);
return getjiajian(newstr);
}
return newstr;
}
/*
* 两个数字加减乘除的计算
*/
public static String getsuanshi(String str){
double c=0.0;
String str2[];
if(str.contains("+")){
str2=str.split("[+]");
c=getjia(Double.parseDouble(str2[0]),Double.parseDouble(str2[1]));
}else if(str.contains("-")){
str2=str.split("[-]");
c=getjian(Double.parseDouble(str2[0]),Double.parseDouble(str2[1]));
}else if(str.contains("*")){
str2=str.split("[*]");
c=getcheng(Double.parseDouble(str2[0]),Double.parseDouble(str2[1]));
}else if(str.contains("/")){
str2=str.split("[/]");
c=getchu(Double.parseDouble(str2[0]),Double.parseDouble(str2[1]));
}
NumberFormat format=NumberFormat.getInstance();
//设置数的小数部分所允许的最大位数,避免小数位被舍掉
format.setMaximumFractionDigits(30);
//设置数的小数部分所允许的最小位数,避免小数位有多余的0
format.setMinimumFractionDigits(0);
//去掉科学计数法显示,避免显示为111,111,111,111
format.setGroupingUsed(false);
return format.format(c);
}
/**
* 加减乘除的基础运算
* @param a
* @param b
* @return
*/
public static Double getjia(double a,double b){
double c=a+b;
return c;
}
public static Double getjian(double a,double b){
double c=a-b;
return c;
}
public static Double getcheng(double a,double b){
double c=a*b;
return c;
}
public static Double getchu(double a,double b){
double c=a/b;
return c;
}
}