Java计算器最终版本
把上一版的计算器完善了下,目前可以支持加减乘除、多级括号及浮点运算,以下为源码:
计算器类:
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* 简单的计算器,支持加减乘除、多级括号及浮点运算
*
* @author Zero
* @version 1.0
* @Time 2017-02-17
* @Site Http://ay123.net
*/
public class Calculator {
/**
* Main function
*/
public static void calculator(){
Scanner input = new Scanner(System.in);
StringBuilder s = new StringBuilder(
input.nextLine().replaceAll(" ", ""));
StringBuilder subexpression;
StringBuilder result;
int length = 0;
while (true){
subexpression = new StringBuilder(
getSubexpression(s.toString()));
String abc = getExpressionResult(subexpression.toString());
result = new StringBuilder(abc);
length = s.length();
if (subexpression.length() == length)
break;
s.replace(s.indexOf("(" + subexpression.toString() + ")"),
s.indexOf("(" + subexpression.toString() + ")") +
subexpression.length() + 2,
result.toString());
}
System.out.println("= " + result);
}
/**
* Get subexpression inside the brackets
* @param expression
* Expression need to calculate
*/
public static String getSubexpression(String expression){
StringBuilder s = new StringBuilder(expression);
while (true){
Pattern pattern = Pattern.compile(
"\\(([a-z0-9\\+\\-\\*\\/\\.]*?)\\)");
Matcher matcher = pattern.matcher(s.toString());
StringBuilder sb;
if (matcher.find()){
sb = new StringBuilder(matcher.group(1));
s = new StringBuilder(sb.toString());
}
else
break;
}
return s.toString();
}
/**
* Calculate the expression's result
* @param expression
* Expression need to calculate
*/
public static String getExpressionResult(String expression){
StringBuilder subexpression = new StringBuilder(expression);
StringBuilder result = new StringBuilder("");
StringBuilder subresult = new StringBuilder("");
int currentOperate = 0;
Pattern pattern;
Matcher matcher;
String[] operatorPriority = {"(\\-*\\d+\\.*\\d*)(\\*|\\/)
(\\-*\\d+\\.*\\d*)",
"(\\-*\\d+\\.*\\d*)(\\+|\\-)
(\\-*\\d+\\.*\\d*)"};
while (true){
// First check if any operator in the statement
pattern = Pattern.compile("\\d+[\\+\\-\\*\\/]");
matcher = pattern.matcher(subexpression);
// Have match '+', '-', '*', '/'
if (matcher.find()){
pattern = Pattern.compile(operatorPriority[currentOperate]);
matcher = pattern.matcher(subexpression);
if (matcher.find()){
String a = matcher.group(1);
String b = matcher.group(2);
String c = matcher.group(3);
String abc = a + b + c;
double i = 0;
switch (b){
case "*":
i = Double.parseDouble(a) * Double.parseDouble(c);
break;
case "/":
checkIfZero(c);
i = Double.parseDouble(a) / Double.parseDouble(c);
break;
case "+":
i = Double.parseDouble(a) + Double.parseDouble(c);
break;
case "-":
i = Double.parseDouble(a) - Double.parseDouble(c);
break;
}
subresult = subexpression.replace(
subexpression.indexOf(abc),
subexpression.indexOf(abc) + abc.length(),
String.format("%.2f", i));
}
else
currentOperate =1;
}
else
break;
}
return subresult.toString();
}
/**
* Check if the dividor is 0
* @param expression
* Expression need to calculate
*/
public static void checkIfZero(String s){
if (s.equals("0")){
System.out.println("Dividor can't be 0!");
return;
}
}
}
调用:
public class Main {
public static void main(String[] args) {
Calculator.calculator();
}
}
运行结果:
版权声明:
作者:bin
链接:https://ay123.net/mystudy/550/
来源:爱影博客
文章版权归作者所有,未经允许请勿转载。
THE END
0
二维码
海报
Java计算器最终版本
把上一版的计算器完善了下,目前可以支持加减乘除、多级括号及浮点运算,以下为源码:
计算器类:
import java.util.Scanner;
import java.util.regex.Matche……

共有 0 条评论