我正在学习 Java,并且一直在编写计算器类(class)。目前,它仅设计用于对两个数字进行简单操作,例如2 + 2。这是我的一小部分代码:
public static void start()
{
System.out.println("Calculator. Type \"exit\" to quit.");
System.out.print("> ");
Scanner scan = new Scanner(System.in);
String entry = scan.nextLine();
while (! (entry.equals("exit")))
{
String [] values = entry.replaceAll("(^\\s+|\\s+$)", "").split("\\s+");
num1 = new Double(values[0]);
operand = values[1];
num2 = new Double(values[2]);
...
}
...
}
...
在此之后是一个 switch 语句,它是 while 循环的一部分。 switch 语句测试 operand
的值,调用适当的方法,打印结果,然后重新启动 while 循环。
我自己没有编写正则表达式部分的代码,但通过阅读以前的 StackOverlfow 帖子,我了解到它会忽略我想要的值之前、中间和之后的任何空白字符。
代码工作正常,除非空白字符不分隔 num1
、operand
和 num2
。
例如:
> 2 + 2
4.0
>2 + 2
4.0
但是:
>2+2
Exception in thread "main" java.lang.NumberFormatException: For input string: "2+2"
at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:1250)
at java.lang.Double.valueOf(Double.java:504)
at java.lang.Double.<init>(Double.java:597)
at calc.Calc.start(Calc.java:24)
at calc.CalcClient.main(CalcClient.java:8)
Java Result: 1
并且:
>2+ 2
Exception in thread "main" java.lang.NumberFormatException: For input string: "2+"
at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:1250)
at java.lang.Double.valueOf(Double.java:504)
at java.lang.Double.<init>(Double.java:597)
at calc.Calc.start(Calc.java:24)
at calc.CalcClient.main(CalcClient.java:8)
Java Result: 1
并且:
>2 +2
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 2
at calc.Calc.start(Calc.java:26)
at calc.CalcClient.main(CalcClient.java:8)
Java Result: 1
我的错误在哪里?是数组问题、我解析字符串的方式问题还是其他问题?我想对其进行编码,以便用户可以输入他们想要的空格,或者根本没有空格。
感谢您的帮助!
最佳答案
答案作为示例提供:
// extract the operands and operator
String[] operandsArrStr = "22+ 2".replaceAll("\\s+", "").split("[\\+\\-\\/\\*]"); // {"22", "2"}
String operator = "22+ 2".replaceAll("(\\s+|\\d+|\\.)", ""); // "+"
// convert the values to doubles
Double[] operands = new Double[operandsArrStr.length];
for (int i=0; i < operandsArrStr.length; i++) {
operands[i] = new Double(operandsArrStr[i]);
}
Double res = null;
// calc
if ("+".equals(operator)) {
res = operands[0] + operands[1]; // assuming only two operands and one operator!
}
else if ("-".equals(operator)) {
res = operands[0] - operands[1];
}
else if ("/".equals(operator)) {
res = operands[0] / operands[1];
}
else if ("*".equals(operator)) {
res = operands[0] * operands[1];
}
System.out.println("res = " + res); // prints 24.0
关于java - 解析字符串以忽略空格时出错,计算器类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25070059/