该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
package com.frank.action; import java.text.DecimalFormat; public class Jisuan { private static int CHENG_INDEX; //* 下标
private static int CHU_INDEX; // /下标
private static int JIA_INDEX; // + 下标
private static int JIAN_INDEX; // - 下标
private static int NUM1_INDEX;//运算符的前一个运算符下标
private static int NUM2_INDEX;//运算符的后一个运算符下标
private static double NUM1;//第一个数
private static double NUM2;//第二个数
private static String STR; //原始表达式
static DecimalFormat df = new DecimalFormat("#.##"); //格式化计算数字方便算法
public static void main(String[] args) {
String str="100-8*2";
STR = str;
J(str);
}
/**
* @param str 表达式
*/
public static void J(String str){
CHENG_INDEX = str.indexOf("*"); //获取 * 下标
CHU_INDEX = str.indexOf("/"); //获取 / 下标
JIA_INDEX = str.indexOf("+"); //获取 + 下标
JIAN_INDEX = str.indexOf("-"); //获取 - 下标
if(JIA_INDEX == -1 && JIAN_INDEX == -1 && CHENG_INDEX == -1 && CHU_INDEX == -1){
System.out.println("最后计算结果是:"+STR+"="+str);
}else if(CHENG_INDEX == -1 && CHU_INDEX == -1){ //* /同时不存在
if(JIA_INDEX != -1 && JIAN_INDEX == -1){ //只存在 +
J(Jia(str, "+", JIA_INDEX)); //调用加法运算方法
}else if(JIA_INDEX == -1 && JIAN_INDEX != -1){ //只存在 -
J(Jian(str, "-", JIAN_INDEX)); //调用减法运算方法
}else if(JIA_INDEX != -1 && JIAN_INDEX != -1){ //同时存在 + -
if(JIA_INDEX > JIAN_INDEX){ //判断先后顺序
J(Jian(str, "-", JIAN_INDEX)); //调用减法运算方法
}else{
J(Jia(str, "+", JIA_INDEX)); //调用加法运算方法
}
}
}else if(CHENG_INDEX != -1 && CHU_INDEX == -1){ //只存在 *
J(Cheng(str, "*", CHENG_INDEX)); //调用乘法运算方法
}else if(CHENG_INDEX == -1 && CHU_INDEX != -1){ //只存在 /
J(Chu(str, "/", CHU_INDEX)); //调用除法运算方法
}else if(CHENG_INDEX != -1 && CHU_INDEX != -1){ //同时存在 * /
if(CHENG_INDEX > CHU_INDEX){ //判断先后顺序
J(Chu(str, "/", CHU_INDEX)); //调用除法运算方法
}else{
J(Cheng(str, "*", CHENG_INDEX)); //调用乘法运算方法
}
}
}
// 求第一个数
private static String Num1(String string, String str, int index){
NUM1_INDEX = 0;
for(int i = string.substring(0,index).length() - 1;i >= 0;i--){//遍历预算符前面字符求第一个数
if(!String.valueOf(string.substring(0,index).charAt(i)).matches("[0-9]|[\\.]")){//正则表达式验证
NUM1_INDEX = i; //获取前一个运算符下标
break;
}
}
if(NUM1_INDEX == 0){ //如果前面没有运算符
return df.format(Double.valueOf(string.substring(0,index)));
}else{
return df.format(Double.valueOf(string.substring(0, index).substring(NUM1_INDEX+1, index)));//求第一个数
}
}
// 求第二个数
private static String Num2(String string, String str, int index){
NUM2_INDEX = 0;
for(int i = 0;i < string.substring(index+1,string.length()).length();i++){//遍历预算符前面字符求第一个数
if(!String.valueOf(string.substring(index+1,string.length()).charAt(i)).matches("[0-9]|[\\.]")){//正则表达式验证
NUM2_INDEX = i; //获取后一个运算符下标
break;
}
}
if(NUM2_INDEX == 0){ //如果后面没有运算符
return df.format(Double.valueOf(string.substring(index+1,string.length())));
}else{
return df.format(Double.valueOf(string.substring(index+1, string.length()).substring(0,NUM2_INDEX)));//求第二个数
}
}
/**
*
* @param string 计算公式
* @param str 计算符号
* @param index 计算符号下标
* @return
*/
private static String Jia(String string, String str, int index){
if("+".equals(str)){
NUM1 = Double.valueOf(Num1(string, str, index)); //获取第一个数
NUM2 = Double.valueOf(Num2(string, str, index)); //获取第二个数
if(NUM1_INDEX == 0 && NUM2_INDEX == 0){ //如果前后没有运算符
string = df.format((NUM1+NUM2));
}else if(NUM1_INDEX == 0){
string = df.format((NUM1+NUM2))+string.substring(NUM2_INDEX + index + 1, string.length()); //拼接字符串
}else if(NUM1_INDEX != 0 && NUM2_INDEX == 0){
string = string.substring(0, NUM1_INDEX+1)+df.format((NUM1+NUM2)); //拼接字符串
}else{
string = string.substring(0, NUM1_INDEX+1)+df.format((NUM1+NUM2))+string.substring(NUM2_INDEX + index + 1, string.length()); //拼接字符串
}
}
System.out.println(string);
return string;
}
private static String Jian(String string, String str, int index){
if("-".equals(str)){
NUM1 = Double.valueOf(Num1(string, str, index)); //获取第一个数
NUM2 = Double.valueOf(Num2(string, str, index)); //获取第二个数
if(NUM1_INDEX == 0 && NUM2_INDEX == 0){ //如果前后没有运算符
string = df.format((NUM1-NUM2));
}else if(NUM1_INDEX == 0){
string = df.format((NUM1-NUM2))+string.substring(NUM2_INDEX + index + 1, string.length()); //拼接字符串
}else if(NUM1_INDEX != 0 && NUM2_INDEX == 0){
string = string.substring(0, NUM1_INDEX+1)+df.format((NUM1-NUM2)); //拼接字符串
}else{
string = string.substring(0, NUM1_INDEX+1)+df.format((NUM1-NUM2))+string.substring(NUM2_INDEX + index + 1, string.length()); //拼接字符串
}
}
System.out.println(string);
return string;
}
private static String Cheng(String string, String str, int index){
if("*".equals(str)){
NUM1 = Double.valueOf(Num1(string, str, index)); //获取第一个数
NUM2 = Double.valueOf(Num2(string, str, index)); //获取第二个数
if(NUM1_INDEX == 0 && NUM2_INDEX == 0){ //如果前后没有运算符
string = df.format((NUM1*NUM2));
}else if(NUM1_INDEX == 0 && NUM2_INDEX != 0){
string = df.format((NUM1*NUM2))+string.substring(NUM2_INDEX + index + 1, string.length()); //拼接字符串
}else if(NUM1_INDEX != 0 && NUM2_INDEX == 0){
string = string.substring(0, NUM1_INDEX+1)+df.format((NUM1*NUM2)); //拼接字符串
}else{
string = string.substring(0, NUM1_INDEX+1)+df.format((NUM1*NUM2))+string.substring(NUM2_INDEX + index + 1, string.length()); //拼接字符串
}
}
System.out.println(string);
return string;
}
private static String Chu(String string, String str, int index){
if("/".equals(str)){
NUM1 = Double.valueOf(Num1(string, str, index)); //获取第一个数
NUM2 = Double.valueOf(Num2(string, str, index)); //获取第二个数
if(NUM1_INDEX == 0 && NUM2_INDEX == 0){ //如果前后没有运算符
string = df.format((NUM1/NUM2));
}else if(NUM1_INDEX == 0){
string = df.format((NUM1/NUM2))+string.substring(NUM2_INDEX + index + 1, string.length()); //拼接字符串
}else if(NUM1_INDEX != 0 && NUM2_INDEX == 0){
string = string.substring(0, NUM1_INDEX+1)+df.format((NUM1/NUM2)); //拼接字符串
}else{
string = string.substring(0, NUM1_INDEX+1)+df.format((NUM1/NUM2))+string.substring(NUM2_INDEX + index + 1, string.length()); //拼接字符串
}
}
System.out.println(string);
return string;
}
}