Вычислять математические выражения, содержащие проценты

Я делаю калькулятор 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%"), показывает результат, что означает, что она может обрабатывать % символы. Как я могу добавить эту функциональность в этот код?

Вам нужно будет добавить логику в свой синтаксический анализатор, чтобы идентифицировать оператор % и преобразовать число перед ним в десятичное значение. Кстати, я рекомендую вам создать именованный класс, а не использовать анонимный класс с new Object{...}.

Code-Apprentice 03.04.2023 17:42

Вам нужно расширить цикл while ((ch >= '0' && ch <= '9') || ch == '.') в parseFactor(), чтобы также принять символ %. Затем вам нужно выполнить преобразование вручную, если str.substring(startPos, this.pos) содержит этот символ.

f1sh 03.04.2023 17:44

Да, @f1sh, это помогло мне решить эту проблему, спасибо! :)

Zeninツ 03.04.2023 17:57
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
3
61
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Код для обработки % в выражении будет простой модификацией, как в методе 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;
    }

:)

Другие вопросы по теме