Пишу калькулятор, в который можно вбивать математические выражения любой длины, после чего пользователь нажимает клавишу "=" и калькулятор выполняет вычисления. Проблема в том, что изначально введённые пользователем данные имеют строковый тип (как на рисунке ниже), как мне преобразовать данную строку в математическое выражение типа double?
В простейшем случае все выглядит примерно так... Для того, чтобы соблюдать порядок действий этот метод не подходит. Полагаю, что в таком случае реализуется обратная польская запись (но это уже совершенно другая тема для обсуждения).
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!");
}
}
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Пример : на факультете 5 кафедр, где
Хотите улучшить этот вопрос? Обновите вопрос так, чтобы он вписывался в тематику Stack Overflow на русском
Всем привет, в моём проекте sfml используется ввод текста в текстовое полеПо умолчанию такой функции нет в sfml, но я поискал в интернете и нашёл...