设置了输入格式,格式有误会出现异常,提示输入格式错误
除数为零时也会出现异常,提示除数不能为零
代码如下
import java.math.BigDecimal;
import java.util.Scanner;
public class Calculator {
static Scanner sc = new Scanner(System.in);
public static void calculate() {
System.out.println("请输入计算式,例:\n2.5*3.2\n仅支持两个数的加减乘除(+-*/),不能包含空格或其他字符:");
// 读取计算式
String text = "";
char operator = 0;// + - * / 运算符
int n = -1;// 记录运算符在计算式中的位置
String num = "";// 存放数值的临时变量
int i = 1;// 循环变量
while(true) {
try {
text = sc.nextLine();
//处理num1带+ - 符号的情况,不带正负号也行
num += text.charAt(0);
break;
}catch(Exception e) {
//还未输入计算式误按回车
System.out.println("请输入计算式:");
}
}
//在text计算式中进行逐个字符判断
while (i < text.length()) {
switch (text.charAt(i)) {
case '+':
case '-':
case '*':
case '/':
operator = text.charAt(i);
n = i;
break;
default:
num += text.charAt(i);
i++;
continue;
}
break;
}
// 初始化num1和num2以及结果rs
BigDecimal num1 = new BigDecimal(0), num2 = new BigDecimal(0), rs = new BigDecimal(0);
// 读入num1和num2,以及运算处理,若输入格式错误,可能会出异常
try {
num1 = new BigDecimal(num);
num = "";
for (i = n + 1; i < text.length(); i++) {
num += text.charAt(i);
}
num2 = new BigDecimal(num);
} catch (Exception e) {
System.out.println("输入格式错误");
return;
}
try {
// 没有运算符,则代表只输入了一个数
if (operator != 0) {
switch (operator) {
case '+':
rs = num1.add(num2);
break;
case '-':
rs = num1.subtract(num2);
break;
case '*':
rs = num1.multiply(num2);
break;
case '/':
rs = num1.divide(num2);
break;
}
} else {
rs = num1;
}
// 以非指数形式输出,并去除小数部分多余的0
System.out.println(rs.stripTrailingZeros().toPlainString());
} catch (Exception e) {
System.out.println("除数不能为零");
}
}
public static void main(String[] args) {
calculate();
while (true) {
System.out.println("进行新的计算:y/n");
String command = sc.nextLine();
if (command.equals("n")) {
sc.close();
break;
} else if (command.equals("y")) {
calculate();
} else {
System.out.println("指令错误");
}
}
}
}
部分测试用例