Я делаю калькулятор Java с графическим интерфейсом и искал функцию, которая вычисляет математическое выражение из строки. Я нашел Как вычислить математическое выражение, заданное в строковой форме?. После упрощения, поскольку мой калькулятор не такой сложный, я получил эту функцию:
// Esto es de StackOverflow, solo que quitando cosas que no se usaban
// https://stackoverflow.com/questions/3422673/how-to-evaluate-a-math-expression-given-in-string-form
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));
return x;
}
}.parse();
}
Вот как он запускает функцию
boton_equ.setOnMouseClicked((event) -> {
this.out.setText(String.valueOf(calcular()));
});
Я хотел добавить функцию, которая, если строка равна ("5*2%"), показывает результат, что означает, что она может обрабатывать % символы. Как я могу добавить эту функциональность в этот код?
Вам нужно расширить цикл while ((ch >= '0' && ch <= '9') || ch == '.') в parseFactor(), чтобы также принять символ %. Затем вам нужно выполнить преобразование вручную, если str.substring(startPos, this.pos) содержит этот символ.
Да, @f1sh, это помогло мне решить эту проблему, спасибо! :)




Код для обработки % в выражении будет простой модификацией, как в методе parseFactor(), измените его на
// 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 == '.' || ch == '%')
nextChar();
// Esto para que funcione con los %
if (str.substring(startPos, this.pos).contains("%"))
x = Double.parseDouble(str.substring(startPos, this.pos).replace("%", "")) / 100;
else
x = Double.parseDouble(str.substring(startPos, this.pos));
return x;
}
:)
Вам нужно будет добавить логику в свой синтаксический анализатор, чтобы идентифицировать оператор
%и преобразовать число перед ним в десятичное значение. Кстати, я рекомендую вам создать именованный класс, а не использовать анонимный класс сnew Object{...}.