java - 解析字符串以忽略空格时出错,计算器类

标签 java regex parsing

我正在学习 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 帖子,我了解到它会忽略我想要的值之前、中间和之后的任何空白字符。

代码工作正常,除非空白字符不分隔 num1operandnum2

例如:

> 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/

相关文章:

Java ComboBox 返回 -1/null

java - Java 方法中的静态变量是否像 PHP 函数中的行为一样?

regex - Perl/Sed 命令多次替换相同的模式

java - 多次查找两个字符串之间的所有字符串

excel - 使用 Excel 在字母数字字符串中出现的某些字母的总和

java - 如何限制 Servlet 映射仅用于某些扩展

java - 在 Java 中将浮点值四舍五入为最接近的整数的最有效方法是什么?

java - 从给定的 url 中提取主域名

c++ - 使用 strtok() 解析字符串

parsing - 有没有办法在宏中实现可选表达式?