+ Rispondi al Thread
Visualizzazione dei risultati da 1 a 4 su 4

Discussione: Calcolare contenuto stringa

  1. #1
    Missileback non è in linea Scolaretto
    Luogo
    Massa(MS)
    Post
    77

    Calcolare contenuto stringa

    Salve, sto facendo una calcolatrice , ora ho fatto due JTextField, ma mi piacerebbe fare una JTextField e calcolare tutto il suo contenuto messo dall'utente o dai vari pulsanti che farò.

    Esempio :

    String content = "2+3-5/2";

    come faccio ad calcolare il tutto?

    Grazie mille e buona serata.

  2. #2
    L'avatar di AntonioG
    AntonioG non è in linea Moderatore Globale Ultimo blog: Commodore 64 e Codemotion
    Luogo
    Roma
    Post
    13,969
    Blogs
    5
    Non puoi farlo facilmente. Devi scrivere un parse (ad esempio un parser a discesa ricorsiva).
    Avvisi generali e importanti, a pena CHIUSURA thread e/o BAN
    Il crossposting è vietato.
    Le richieste di "pappa pronta" sono vietate.
    Utilizzate i tag CODE per il codice.
    Leggere il Regolamento per chiarimenti PRIMA di creare nuovi thread.
    Utilizzare sempre i PM per comunicare con i moderatori.
    Non mi contattate in PM per problemi di software, usate il forum

  3. #3
    Missileback non è in linea Scolaretto
    Luogo
    Massa(MS)
    Post
    77
    infatti .. ma ho trovato il termine in inglese "java string calculator" e mi e venuto fuori questo codice:

    codice:
    public static double eval(final String str) {
        class Parser {
            int pos = -1, c;
    
            void eatChar() {
                c = (++pos < str.length()) ? str.charAt(pos) : -1;
            }
    
            void eatSpace() {
                while (Character.isWhitespace(c)) eatChar();
            }
    
            double parse() {
                eatChar();
                double v = parseExpression();
                if (c != -1) throw new RuntimeException("Unexpected: " + (char)c);
                return v;
            }
    
            // Grammar:
            // expression = term | expression `+` term | expression `-` term
            // term = factor | term `*` factor | term `/` factor | term brackets
            // factor = brackets | number | factor `^` factor
            // brackets = `(` expression `)`
    
            double parseExpression() {
                double v = parseTerm();
                for (;;) {
                    eatSpace();
                    if (c == '+') { // addition
                        eatChar();
                        v += parseTerm();
                    } else if (c == '-') { // subtraction
                        eatChar();
                        v -= parseTerm();
                    } else {
                        return v;
                    }
                }
            }
    
            double parseTerm() {
                double v = parseFactor();
                for (;;) {
                    eatSpace();
                    if (c == '/') { // division
                        eatChar();
                        v /= parseFactor();
                    } else if (c == '*' || c == '(') { // multiplication
                        if (c == '*') eatChar();
                        v *= parseFactor();
                    } else {
                        return v;
                    }
                }
            }
    
            double parseFactor() {
                double v;
                boolean negate = false;
                eatSpace();
                if (c == '+' || c == '-') { // unary plus & minus
                    negate = c == '-';
                    eatChar();
                    eatSpace();
                }
                if (c == '(') { // brackets
                    eatChar();
                    v = parseExpression();
                    if (c == ')') eatChar();
                } else { // numbers
                    int startIndex = this.pos;
                    while ((c >= '0' && c <= '9') || c == '.') eatChar();
                    if (pos == startIndex) throw new RuntimeException("Unexpected: " + (char)c);
                    v = Double.parseDouble(str.substring(startIndex, pos));
                }
    
                eatSpace();
                if (c == '^') { // exponentiation
                    eatChar();
                    v = Math.pow(v, parseFactor());
                }
                if (negate) v = -v; // unary minus is applied after exponentiation; e.g. -3^2=-9
                return v;
            }
        }
        return new Parser().parse();
    }
    link:
    java - Evaluating a math expression given in string form - Stack Overflow

    System.out.println(eval("2^3 - 3 + 1 + 3 * ((4+4*4)/2) / 5 + -5"));

    link di test:
    https://www.wolframalpha.com/input/?i=2^3+-+3+%2B+1+%2B+3+*+%28%284%2B4*4%29%2F2%29+%2F+5+%2B +-5

    ora me lo devo studiare per capire cosa c'è scritto e poi ti faro sapere.

    grazie mille.

  4. #4
    Missileback non è in linea Scolaretto
    Luogo
    Massa(MS)
    Post
    77
    ok, funziona .. lo implementato alla mia calcolatrice ed funziona ed ho confrontato le calcolatrice dei sistemi che ho e fanno tutti il risultato uguale.

    ti ringrazio molto.

    buona serata.

+ Rispondi al Thread

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi