Spring Boot - Evaluating a Math Expression in Java

holman khan

Well-known member
  • Oct 19, 2021
    846
    563
    93
    මචන් අපිට spring boot වලීන් ගන්න පුළුවන් maths evaluate කරන්න පුළුවන් හොදම maven library එක මොකක් ද


    task -ෆ්රෝන්ටෙන්ඩ් එකෙන් මත්ස් formula එක එනව එක paramters ටික db එකෙන් අරන් හදල පෙන්නන්න තියෙන්නේ
    මචන් අපිට spring boot වලීන් ගන්න පුළුවන් maths evaluate කරන්න පුළුවන් හොදම maven library එක මොකක් ද


    එක formula එකක් නෙමේ එන්නේ , Fortend එකෙන් string එකක් විදියට එන එකකට db එකෙන් කොහොමද data replace කරන්න හොදම විදිය

    .නැත්නම් ෆ්රෝන්ටෙන්ඩ් එකෙන් backend එක පැත්තට එවන්න පුළුවන් හොද විදිය කුමක්ද
     

    EKGuest

    Well-known member
  • Nov 16, 2022
    3,206
    5,703
    113
    Formula එක මොන වගේද? උදාහරණ කීපයක් දෙන්න බලන්න.

    නෙට් එකේ තියෙන කෝඩ් හරියන්නෙ නැද්ද වැඩේට? මේ GeeksForGeeks ජාවා code එකෙන් 100 * ( 2 + 12 ) / 14 වගේ expressions evaluate කරන්න පුලුවන්.

    https://www.geeksforgeeks.org/expression-evaluation/

    Java:
    /* A Java program to evaluate a
    given expression where tokens
    are separated by space.
    */
    import java.util.Stack;
    
    public class EvaluateString
    {
        public static int evaluate(String expression)
        {
            char[] tokens = expression.toCharArray();
    
            // Stack for numbers: 'values'
            Stack<Integer> values = new
                                Stack<Integer>();
    
            // Stack for Operators: 'ops'
            Stack<Character> ops = new
                                Stack<Character>();
    
            for (int i = 0; i < tokens.length; i++)
            {
               
                // Current token is a
                // whitespace, skip it
                if (tokens[i] == ' ')
                    continue;
    
                // Current token is a number,
                // push it to stack for numbers
                if (tokens[i] >= '0' &&
                    tokens[i] <= '9')
                {
                    StringBuffer sbuf = new
                                StringBuffer();
                   
                    // There may be more than one
                    // digits in number
                    while (i < tokens.length &&
                            tokens[i] >= '0' &&
                            tokens[i] <= '9')
                        sbuf.append(tokens[i++]);
                    values.push(Integer.parseInt(sbuf.
                                        toString()));
               
                    // right now the i points to
                    // the character next to the digit,
                    // since the for loop also increases
                    // the i, we would skip one
                    // token position; we need to
                    // decrease the value of i by 1 to
                    // correct the offset.
                    i--;
                }
    
                // Current token is an opening brace,
                // push it to 'ops'
                else if (tokens[i] == '(')
                    ops.push(tokens[i]);
    
                // Closing brace encountered,
                // solve entire brace
                else if (tokens[i] == ')')
                {
                    while (ops.peek() != '(')
                    values.push(applyOp(ops.pop(),
                                    values.pop(),
                                    values.pop()));
                    ops.pop();
                }
    
                // Current token is an operator.
                else if (tokens[i] == '+' ||
                        tokens[i] == '-' ||
                        tokens[i] == '*' ||
                            tokens[i] == '/')
                {
                    // While top of 'ops' has same
                    // or greater precedence to current
                    // token, which is an operator.
                    // Apply operator on top of 'ops'
                    // to top two elements in values stack
                    while (!ops.empty() &&
                        hasPrecedence(tokens[i],
                                        ops.peek()))
                    values.push(applyOp(ops.pop(),
                                    values.pop(),
                                    values.pop()));
    
                    // Push current token to 'ops'.
                    ops.push(tokens[i]);
                }
            }
    
            // Entire expression has been
            // parsed at this point, apply remaining
            // ops to remaining values
            while (!ops.empty())
                values.push(applyOp(ops.pop(),
                                values.pop(),
                            values.pop()));
    
            // Top of 'values' contains
            // result, return it
            return values.pop();
        }
    
        // Returns true if 'op2' has higher
        // or same precedence as 'op1',
        // otherwise returns false.
        public static boolean hasPrecedence(
                            char op1, char op2)
        {
            if (op2 == '(' || op2 == ')')
                return false;
            if ((op1 == '*' || op1 == '/') &&
                (op2 == '+' || op2 == '-'))
                return false;
            else
                return true;
        }
    
        // A utility method to apply an
        // operator 'op' on operands 'a'
        // and 'b'. Return the result.
        public static int applyOp(char op,
                            int b, int a)
        {
            switch (op)
            {
            case '+':
                return a + b;
            case '-':
                return a - b;
            case '*':
                return a * b;
            case '/':
                if (b == 0)
                    throw new
                    UnsupportedOperationException(
                        "Cannot divide by zero");
                return a / b;
            }
            return 0;
        }
    
        // Driver method to test above methods
        public static void main(String[] args)
        {
            System.out.println(EvaluateString.
                            evaluate("10 + 2 * 6"));
            System.out.println(EvaluateString.
                        evaluate("100 * 2 + 12"));
            System.out.println(EvaluateString.
                    evaluate("100 * ( 2 + 12 )"));
            System.out.println(EvaluateString.
                evaluate("100 * ( 2 + 12 ) / 14"));
        }
    }
     

    ThisaraMalintha

    Well-known member
  • Nov 16, 2015
    8,612
    7,331
    113
    ගෙදර
    github eke balanna
    wolfram alpha eketh api ekak thiyenawa, complex expressions solve karanna eka use karannath puluwan wei mama hithanne
    එක formula එකක් නෙමේ එන්නේ , Fortend එකෙන් string එකක් විදියට එන එකකට db එකෙන් කොහොමද data replace කරන්න හොදම විදිය
    example?
     

    0x9

    Well-known member
  • Mar 18, 2015
    541
    836
    93
    මචන් අපිට spring boot වලීන් ගන්න පුළුවන් maths evaluate කරන්න පුළුවන් හොදම maven library එක මොකක් ද


    task -ෆ්රෝන්ටෙන්ඩ් එකෙන් මත්ස් formula එක එනව එක paramters ටික db එකෙන් අරන් හදල පෙන්නන්න තියෙන්නේ
    මචන් අපිට spring boot වලීන් ගන්න පුළුවන් maths evaluate කරන්න පුළුවන් හොදම maven library එක මොකක් ද


    එක formula එකක් නෙමේ එන්නේ , Fortend එකෙන් string එකක් විදියට එන එකකට db එකෙන් කොහොමද data replace කරන්න හොදම විදිය

    .නැත්නම් ෆ්රෝන්ටෙන්ඩ් එකෙන් backend එක පැත්තට එවන්න පුළුවන් හොද විදිය කුමක්ද
    https://www.objecthunter.net/exp4j/
    මේක ටිකක් පරණ library එකක්.. latest java version එකක් compatibility ද කියල නම් දන්නේ නෑ.