/*
这里给大家分享一个用于计算器的工具类,里面只有一个方法值核心的代码,
就是名为 baseParse 这个名字的方法,这个方法可以计算一个没有括号的
混合的加减乘除的字符串 比如可以解析 "5*9-3+5*2" 出结果为一个双
精度的52.0 的结果 原理分析:由于+号左右两边可以先运算,所有这里
就拆分成 "5*9-3" 和 "5*2" 这两个字符串,分别再调用 baseParse方法
字符串先算出来,得出一个没有括号的字符串
比如 (2+3*6)*2+5-6*2 + (5-2*(2+3/2))
比如这个字符串,会首先找到靠左的并且最里面的一对括号
最开始找到的就是 "(2+3*6)"这个字符串,然后它会去掉两边的括号,
交给上面那个baseParse 这个方法来计算出结果,然后用 "2+3*6" 的结果
“20” 取代原有的 "(2+3*6)" 这样子原有的整个字符串就变成了
"20*2+5-6*2 + (5-2*(2+3/2))" 然后同理,直到括号不复存在计算出
最后的结果。
这里面最核心的就是递归思想!
*/
/**
* 计算器的工具类,可以帮助 您实现字符串形式的运算
* 例如:"2+3*5-6*(2-4*5)/3+5" 的字符串也可以运算为双精度并返回
* @author Administrator
*
*/
public class CalculatorUtil {
/**
* 可以解析一个带有多个括号的表达式
*
* @param content
* @return
*/
public double parse(String content) throws Exception{
return baseParse(content);
}
/**
* 解析字符串 "5*9-3+5*2" 可以进行没有括号的混合运算
*
* @param content
* @return
*/
public double baseParse(String content) {
content = replaceKuoHao(content);
int index = content.indexOf("+");
if (index > -1) {
// 表示有加号
return baseParse(content.substring(0, index))
+ baseParse(content.substring(index + 1, content.length()));
}
index = content.lastIndexOf("-");
if (index > -1) {
// 如果有减号
return baseParse(content.substring(0, index))
- baseParse(content.substring(index + 1, content.length()));
}
index = content.indexOf("*");
if (index > -1) {
// 如果有乘号
return baseParse(content.substring(0, index))
* baseParse(content.substring(index + 1, content.length()));
}
index = content.lastIndexOf("/");
if (index > -1) {
// 如果有除号
return baseParse(content.substring(0, index))
/ baseParse(content.substring(index + 1, content.length()));
}
if ("".equals(content.trim())) {
return 0;
} else {
return Double.parseDouble(content);
}
}
/**
* 把括号的表达式计算出来后替换掉
*
* @param content
* @return
*/
public String replaceKuoHao(String content) {
// 找到靠左的最里面的一对括号
int index_start = content.indexOf("(");
int index_end = content.indexOf(")", index_start);
index_start = content.lastIndexOf("(", index_end);
while (index_start > -1) {
//得到括号和括号里面的字符串 例如:"(2+6*6)"
String tmp = content.substring(index_start, index_end + 1);
//得到括号里面的字符串 "2+6*6"
String tmpContent = tmp.substring(1, tmp.length() - 1);
//把括号里面的字符串运算完之后,替换原有的括号 即 "38" 替换了 "(2+6*6)"
content = content.replace(tmp, baseParse(tmpContent) + "");
//继续处理其他的括号
index_start = content.indexOf("(");
index_end = content.indexOf(")");
}
//所有的括号都被运算了 ,返回一个没有括号字符串的等式
return content;
}
}
这里给大家分享一个用于计算器的工具类,里面只有一个方法值核心的代码,
就是名为 baseParse 这个名字的方法,这个方法可以计算一个没有括号的
混合的加减乘除的字符串 比如可以解析 "5*9-3+5*2" 出结果为一个双
精度的52.0 的结果 原理分析:由于+号左右两边可以先运算,所有这里
就拆分成 "5*9-3" 和 "5*2" 这两个字符串,分别再调用 baseParse方法
也就是调用自己,直到没有+号为止,然后拆分-号,再拆分*号,最后是/号 ,
这里注意一点:拆分-号和/号的时候,要从字符串的后面开始,因为 比如5-3-2 拆成 "5" 和 "3-2" 就不是原来的值了 /号原理同理。具体请看方法的实现
而方法 replaceKuoHao 则可以处理有括号的,它的作用就是 把有括号的字符串先算出来,得出一个没有括号的字符串
比如 (2+3*6)*2+5-6*2 + (5-2*(2+3/2))
比如这个字符串,会首先找到靠左的并且最里面的一对括号
最开始找到的就是 "(2+3*6)"这个字符串,然后它会去掉两边的括号,
交给上面那个baseParse 这个方法来计算出结果,然后用 "2+3*6" 的结果
“20” 取代原有的 "(2+3*6)" 这样子原有的整个字符串就变成了
"20*2+5-6*2 + (5-2*(2+3/2))" 然后同理,直到括号不复存在计算出
最后的结果。
这里面最核心的就是递归思想!
*/
/**
* 计算器的工具类,可以帮助 您实现字符串形式的运算
* 例如:"2+3*5-6*(2-4*5)/3+5" 的字符串也可以运算为双精度并返回
* @author Administrator
*
*/
public class CalculatorUtil {
/**
* 可以解析一个带有多个括号的表达式
*
* @param content
* @return
*/
public double parse(String content) throws Exception{
return baseParse(content);
}
/**
* 解析字符串 "5*9-3+5*2" 可以进行没有括号的混合运算
*
* @param content
* @return
*/
public double baseParse(String content) {
content = replaceKuoHao(content);
int index = content.indexOf("+");
if (index > -1) {
// 表示有加号
return baseParse(content.substring(0, index))
+ baseParse(content.substring(index + 1, content.length()));
}
index = content.lastIndexOf("-");
if (index > -1) {
// 如果有减号
return baseParse(content.substring(0, index))
- baseParse(content.substring(index + 1, content.length()));
}
index = content.indexOf("*");
if (index > -1) {
// 如果有乘号
return baseParse(content.substring(0, index))
* baseParse(content.substring(index + 1, content.length()));
}
index = content.lastIndexOf("/");
if (index > -1) {
// 如果有除号
return baseParse(content.substring(0, index))
/ baseParse(content.substring(index + 1, content.length()));
}
if ("".equals(content.trim())) {
return 0;
} else {
return Double.parseDouble(content);
}
}
/**
* 把括号的表达式计算出来后替换掉
*
* @param content
* @return
*/
public String replaceKuoHao(String content) {
// 找到靠左的最里面的一对括号
int index_start = content.indexOf("(");
int index_end = content.indexOf(")", index_start);
index_start = content.lastIndexOf("(", index_end);
while (index_start > -1) {
//得到括号和括号里面的字符串 例如:"(2+6*6)"
String tmp = content.substring(index_start, index_end + 1);
//得到括号里面的字符串 "2+6*6"
String tmpContent = tmp.substring(1, tmp.length() - 1);
//把括号里面的字符串运算完之后,替换原有的括号 即 "38" 替换了 "(2+6*6)"
content = content.replace(tmp, baseParse(tmpContent) + "");
//继续处理其他的括号
index_start = content.indexOf("(");
index_end = content.indexOf(")");
}
//所有的括号都被运算了 ,返回一个没有括号字符串的等式
return content;
}
}