如何为Java图形界面计算器添加百分比表达式计算功能?
如何修改Java计算器代码支持百分比(%)运算
要实现5*2%这类含百分比符号的表达式求值,核心是把数字后的%解析为该数字除以100(比如2%等价于0.02),只需修改parseFactor()方法即可,具体如下:
修改逻辑
在解析完数字的代码后,增加对%后缀的判断:如果当前字符是%,就将解析出的数值除以100,同时跳过该符号。
修改后的完整代码
// Esto es de StackOverflow, solo que quitando cosas que no se usaban public double calcular() { // Obtener la expresión matemática como una cadena String str = this.out.getText(); // Crear un nuevo objeto anónimo para evaluar la expresión return new Object() { int pos = -1, ch; // Método para obtener el siguiente caracter de la cadena void nextChar() { ch = (++pos < str.length()) ? str.charAt(pos) : -1; } // Método para verificar si el caracter actual coincide con el pasado por // parámetro boolean eat(int charToEat) { while (ch == ' ') nextChar(); if (ch == charToEat) { nextChar(); return true; } return false; } // Método principal para evaluar la expresión double parse() { nextChar(); double x = parseExpression(); if (pos < str.length()) throw new RuntimeException("No esperado: " + (char) ch); return x; } // Método para evaluar la expresión double parseExpression() { double x = parseTerm(); for (;;) { if (eat('+')) x += parseTerm(); // suma else if (eat('-')) x -= parseTerm(); // resta else return x; } } // Método para evaluar los términos double parseTerm() { double x = parseFactor(); for (;;) { if (eat('*')) x *= parseFactor(); // multiplicación else if (eat('/')) x /= parseFactor(); // división else return x; } } // Método para evaluar los factores(已修改支持%) double parseFactor() { double x; int startPos = this.pos; if (eat('+')) return +parseFactor(); // más unario if (eat('-')) return -parseFactor(); // menos unario while ((ch >= '0' && ch <= '9') || ch == '.') nextChar(); x = Double.parseDouble(str.substring(startPos, this.pos)); // 新增:处理百分比符号 if (eat('%')) { x /= 100; } return x; } }.parse(); }
验证示例
- 输入
5*2%,计算结果为0.1(即5 * (2/100)) - 输入
3+5%,计算结果为3.05(即3 + (5/100)) - 输入
100%,计算结果为1.0
内容的提问来源于stack exchange,提问作者user15558580
相关产品推荐
相关产品推荐

