4
5 import java.util.regex.Matcher;
6 import java.util.regex.Pattern;
7
8
9 public class ComputeExpression {
10 /**
11 * 计算字符串四则运算表达式
12 */
13 public static String computeString(String string){
14 String regexCheck = " [\\(\\)\\d\\+\\-\\*/\\.]* " ; // 是否是合法的表达式
15
16 if ( ! Pattern.matches(regexCheck, string))
17 return string;
18
19 Matcher matcher = null ;
20 String temp = "" ;
21 int index = - 1 ;
22 String regex = " \\([\\d\\.\\+\\-\\*/]+\\) " ; // 提取括号表达式
23 string = string.replaceAll( " \\s " , "" ); // 去除空格
24 try {
25 Pattern pattern = Pattern.compile(regex);
26 // 循环计算所有括号里的表达式
27 while (pattern.matcher(string).find()){
28 matcher = pattern.matcher(string);
29 while (matcher.find()){
30 temp = matcher.group();
31 index = string.indexOf(temp);
32 string = string.substring( 0 , index) + computeStirngNoBracket(temp) + string.substring(index + temp.length());
33 }
34 }
35 // 最后计算总的表达式结果
36 string = computeStirngNoBracket(string);
37 } catch (NumberFormatException e) {
38 return e.getMessage();
39 }
40 return string;
41 }
42
43 /**
44 * 计算不包含括号的表达式
45 */
46 private static String computeStirngNoBracket(String string){
47 string = string.replaceAll( " (^\\()|(\\)$) " , "" );
48 String regexMultiAndDivision = " [\\d\\.]+(\\*|\\/)[\\d\\.]+ " ;
49 String regexAdditionAndSubtraction = " [\\d\\.]+(\\+|\\-)[\\d\\.]+ " ;
50
51 String temp = "" ;
52 int index = - 1 ;
53
54 // 解析乘除法
55 Pattern pattern = Pattern.compile(regexMultiAndDivision);
56 Matcher matcher = null ;
57 while (pattern.matcher(string).find()){
58 matcher = pattern.matcher(string);
59 if (matcher.find()){
60 temp = matcher.group();
61 index = string.indexOf(temp);
62 string = string.substring( 0 , index) + doMultiAndDivision(temp) + string.substring(index + temp.length());
63 }
64 }
65
66 // 解析加减法
67 pattern = Pattern.compile(regexAdditionAndSubtraction);
68 while (pattern.matcher(string).find()){
69 matcher = pattern.matcher(string);
70 if (matcher.find()){
71 temp = matcher.group();
72 index = string.indexOf(temp);
73 string = string.substring( 0 , index) + doAdditionAndSubtraction(temp) + string.substring(index + temp.length());
74 }
75 }
76
77 return string;
78 }
79
80 /**
81 * 执行乘除法
82 */
83 private static String doMultiAndDivision(String string){
84 String value = "" ;
85 double d1 = 0 ;
86 double d2 = 0 ;
87 String[] temp = null ;
88 if (string.contains( " * " )){
89 temp = string.split( " \\* " );
90 } else {
91 temp = string.split( " / " );
92 }
93
94 if (temp.length < 2 )
95 return string;
96
97 d1 = Double.valueOf(temp[ 0 ]);
98 d2 = Double.valueOf(temp[ 1 ]);
99 if (string.contains( " * " )){
100 value = StringUtil.formatDouble(d1 * d2);
101 } else {
102 value = StringUtil.formatDouble(d1 / d2);
103 }
104
105 return value;
106 }
107
108 /**
109 * 执行加减法
110 */
111 private static String doAdditionAndSubtraction(String string){
112 double d1 = 0 ;
113 double d2 = 0 ;
114 String[] temp = null ;
115 String value = "" ;
116 if (string.contains( " + " )){
117 temp = string.split( " \\+ " );
118 } else {
119 temp = string.split( " \\- " );
120 }
121
122 if (temp.length < 2 )
123 return string;
124
125 d1 = Double.valueOf(temp[ 0 ]);
126 d2 = Double.valueOf(temp[ 1 ]);
127 if (string.contains( " + " )){
128 value = StringUtil.formatDouble(d1 + d2);
129 } else {
130 value = StringUtil.formatDouble(d1 - d2);
131 }
132
133 return value;
134 }
135 public static void main(String[] args) {
136 System.out.println(ComputeExpression.computeString( " (7)*-/+ " ));
137 }
138 }
139