Как сделать из строки численное выражение? [дубликат]

97
14 октября 2021, 12:20
На этот вопрос уже даны ответы здесь:
Парсинг строки в Java (4 ответа)
Закрыт 1 год назад.

Пишу калькулятор, в который можно вбивать математические выражения любой длины, после чего пользователь нажимает клавишу "=" и калькулятор выполняет вычисления. Проблема в том, что изначально введённые пользователем данные имеют строковый тип (как на рисунке ниже), как мне преобразовать данную строку в математическое выражение типа double?

Answer 1

В простейшем случае все выглядит примерно так... Для того, чтобы соблюдать порядок действий этот метод не подходит. Полагаю, что в таком случае реализуется обратная польская запись (но это уже совершенно другая тема для обсуждения).

import java.util.function.BinaryOperator;
import javax.naming.OperationNotSupportedException;
public class Main {
    public static void main(String[] args) throws OperationNotSupportedException {
        String s = "987+696*9";
        Calc calc = new Calc();
        StringBuilder sb = new StringBuilder();
        for (char ch : s.toCharArray()) {
            if (Character.isDigit(ch) || ch=='.')sb.append(ch);
            else{
                calc.apply(Double.valueOf(sb.toString()));
                calc.apply(MathOperation.getBySymbol(ch));                
                sb = new StringBuilder();
            }
        }
        calc.apply(Double.valueOf(sb.toString()));
        System.out.println(calc.getResult());
    }
}
class Calc{
    private Double result;
    private MathOperation mathOperation;
    public void apply (double digit){
        if (result==null) result = digit;
        else result = mathOperation.applyOperation(result, digit);
    }
    public void apply (MathOperation mathOperation){
        this.mathOperation = mathOperation;
    }
    public double getResult(){
        return result;
    }
}
enum MathOperation{
    MULTIPL('*', (x,y)->x*y), 
    DIVIDION('/', (x,y)->x/y),
    SUBSTRACT('-', (x,y)->x-y),
    ADD('+', (x,y)->x+y);
    private final char symbol;
    private final BinaryOperator<Double> operation;
    private MathOperation(char symbol, BinaryOperator<Double> operation){
        this.symbol = symbol;
        this.operation = operation;
    }
    public double applyOperation (double numb1, double numb2){
        return this.operation.apply(numb1, numb2);
    }
    public static MathOperation getBySymbol(final char symbol) throws OperationNotSupportedException {
        for (MathOperation mathOperation : MathOperation.values()) {
            if (mathOperation.symbol==symbol) return mathOperation;
        }
        throw new OperationNotSupportedException("Math.operation " + symbol + " not exist!");
    }
}
READ ALSO
Адаптивная верстка DIV [закрыт]

Адаптивная верстка DIV [закрыт]

Хотите улучшить этот вопрос? Обновите вопрос так, чтобы он вписывался в тематику Stack Overflow на русском

228
Большая задержка в вводе текст SFML

Большая задержка в вводе текст SFML

Всем привет, в моём проекте sfml используется ввод текста в текстовое полеПо умолчанию такой функции нет в sfml, но я поискал в интернете и нашёл...

239
Динамические библиотеки c++ Mac OS

Динамические библиотеки c++ Mac OS

Я новичок в C++Работаю на Macbook

155