Есть строка, которая содержит только арифметическое выражение. Как его посчитать? [дубликат]

164
09 апреля 2019, 19:00

На данный вопрос уже ответили:

  • Как посчитать значение выражения, представленного строкой, и вывести его? 1 ответ

Есть строка, которая содержит только арифметическое выражение, никаких других символов. Как поместить в другую переменную типа double или int результат того арифметического выражения? Например:

public class SomeClass{
    public static void main(String[] args){
        String string = "5+7*3";
        double result = string.?//должно присвоиться значение 26 
    }
}

Я новичок, так что отнеситесь снисходительно)

Answer 1
public class Main {
    public static double eval(final String str) {
        return new Object() {
            int pos = -1, ch;
            void nextChar() {
                ch = (++pos < str.length()) ? str.charAt(pos) : -1;
            }
            boolean eat(int charToEat) {
                while (ch == ' ') nextChar();
                if (ch == charToEat) {
                    nextChar();
                    return true;
                }
                return false;
            }
            double parse() {
                nextChar();
                double x = parseExpression();
                if (pos < str.length()) throw new RuntimeException("Unexpected: " + (char)ch);
                return x;
            }
            double parseExpression() {
                double x = parseTerm();
                for (;;) {
                    if      (eat('+')) x += parseTerm(); // addition
                    else if (eat('-')) x -= parseTerm(); // subtraction
                    else return x;
                }
            }
            double parseTerm() {
                double x = parseFactor();
                for (;;) {
                    if      (eat('*')) x *= parseFactor(); // multiplication
                    else if (eat('/')) x /= parseFactor(); // division
                    else return x;
                }
            }
            double parseFactor() {
                if (eat('+')) return parseFactor(); // unary plus
                if (eat('-')) return -parseFactor(); // unary minus
                double x;
                int startPos = this.pos;
                if (eat('(')) { // parentheses
                    x = parseExpression();
                    eat(')');
                } else if ((ch >= '0' && ch <= '9') || ch == '.') { // numbers
                    while ((ch >= '0' && ch <= '9') || ch == '.') nextChar();
                    x = Double.parseDouble(str.substring(startPos, this.pos));
                } else if (ch >= 'a' && ch <= 'z') { // functions
                    while (ch >= 'a' && ch <= 'z') nextChar();
                    String func = str.substring(startPos, this.pos);
                    x = parseFactor();
                    if (func.equals("sqrt")) x = Math.sqrt(x);
                    else if (func.equals("sin")) x = Math.sin(Math.toRadians(x));
                    else if (func.equals("cos")) x = Math.cos(Math.toRadians(x));
                    else if (func.equals("tan")) x = Math.tan(Math.toRadians(x));
                    else throw new RuntimeException("Unknown function: " + func);
                } else {
                    throw new RuntimeException("Unexpected: " + (char)ch);
                }
                if (eat('^')) x = Math.pow(x, parseFactor()); // exponentiation
                return x;
            }
        }.parse();
    }
    public static void main(String[] args) throws Exception {
        System.out.println(eval("((4 - 2^3 + 1) * -sqrt(3*3+4*4)) / 2"));
    }
}

Отсюда

READ ALSO
Картинки из галереи в GridView Android Studio

Картинки из галереи в GridView Android Studio

Есть такая вот штука

170
Почему подсвечивает красным?

Почему подсвечивает красным?

Почему-то MealRepository repository подчёркнут красным жалуется на то что нет имплементации, а если её добавить то нечего не меняется

182
Математические операции с Generics Java

Математические операции с Generics Java

есть потребность в написание, некоторых математических примитивов, наподобие векторов и матриц

148
Оператор throws и исключения

Оператор throws и исключения

Всем привет, друзья! Хотелось бы спросить: checked исключения, как я понял обязательно должны содержать оператор throws в сигнатуре метода или обрабатываться...

157