【问题标题】:How to cast string to double android calculator App [duplicate]如何将字符串转换为双android计算器应用程序[重复]
【发布时间】:2014-11-20 11:18:30
【问题描述】:

我想构建计算器,所以我要求我获取字符串变量以转换为双精度

字符串输入 = "3+5*-2+4"; 双输入2; //输入到3+5*-2+4;

我想将字符串转换成双精度,谢谢。

【问题讨论】:

  • 我不知道如何解决这个问题。 :(

标签: java android


【解决方案1】:

OP 想要将一串数学运算转换为结果。所以他想输入例如“3+5”,结果是8。

您可以使用内置的 javascript 引擎执行此操作:

public static void main(String[] args) throws Exception {
    ScriptEngineManager mgr = new ScriptEngineManager();
    ScriptEngine engine = mgr.getEngineByName("JavaScript");
    String expression = "3+5*-2+4";
    System.out.println(engine.eval(expression)); //prints -3
}

【讨论】:

    【解决方案2】:

    试试这个代码。

        TextView textView=(TextView)findViewById(R.id.textview1);
        String input = "3+5*-2+4";
        input=input+")";
        Calc calc=new Calc();
        calc.InfPos(string);
        Data result=calc.PostEval();
        if(result.flag==0){
    
            textView.setText("="+result.num);
        }
    

    这是 Calc 类

    public class Calc{
    
    
        public Data[] pos= new Data[50];
        public Data[] data=new Data[50];//used in stack
        int top=-1,MAXSIZE=50;
        Data op=new Data();//stores result and errors
        public Stack <Character> stack =new Stack <Character>();
        public Stack <Double> stackInt =new Stack <Double>();
        public int j;
        void push(Data p)
        {
        if (top== MAXSIZE-1)
        {
    
        /*over flow error*/
        }
        else
        {
        top++;
        data[top]=new Data();
        data[top]=p;
        }
        }
        Data pop()
        {
        Data item = null;
        if (top == -1){
        //stack is empty
        }
        else
        {
        item=data[top];
        top--;
    
        }
        return item;
        }
        int prec(char ch)
        {
               switch(ch)
                {
                case '(':
                        return 1;
                case ')':
                        return 2;
                case '-':
                case '+':
                        return 3;
                case '/':
                case '*':
                        return 4;
                case '^':
                        return 5;
                case '.':return 6;
                default:
                        return 0;
                }
        }
         void InfPos(String eqn){
            double num=0;
            double point=0;
            double pow=1;
            int count=0;
            boolean char_flag=false;
            boolean minus=false;
            boolean decimal=false;
        stack.push('(');
        j=-1;
        j++;
        pos[j]=new Data();
        pos[j].ch='(';
        pos[j].flag=3;
    
            for(int i = 0;i<eqn.length();i++){
                if(eqn.charAt(i)>=48 && eqn.charAt(i)<=57){
                    if(decimal==true)
                        count++;
            switch(eqn.charAt(i)){
            case '0':num=(num*10)+0;
                break;
            case '1':num=(num*10)+1;
            break;
            case '2':num=(num*10)+2;
            break;
            case '3':num=(num*10)+3;
            break;
            case '4':num=(num*10)+4;
            break;
            case '5':num=(num*10)+5;
            break;
            case '6':num=(num*10)+6;
            break;
            case '7':num=(num*10)+7;
            break;
            case '8':num=(num*10)+8;
            break;
            case '9':num=(num*10)+9;
            break;
            }
            if(eqn.charAt(i+1)<48)
            {
                if(decimal==true){
                    for(int k=0;k<count;k++){
                        pow=pow*10;
                    }
                    point=num/pow;
                    if((j>=0 && pos[j].flag==1) && pos[j].num_set!=true){
                        if(pos[j].num<0)
                        {
                            point=point*-1;
                            minus=false;
                        }
                    num=pos[j].num+point;
                    }
                    else{
                        num=0+point;
                        j++;
                        pos[j]=new Data();
                    }
                    if(minus==true)
                    {
                        num=num*-1;
                        minus=false;
                    }
                    pos[j].num=num;
                    pos[j].flag=1;
                    pos[j].num_set=true;
                    num=0;
                    count=0;
                    pow=1;
                    decimal=false;
                     minus=false;
                     char_flag=false;
    
                }
                else{
                j++;
                pos[j]=new Data();
                if(minus==true)
                {
                    num=num*-1;
                    minus=false;
                }
                pos[j].num=num;
                pos[j].flag=1;
                num=0;
                 minus=false;
                 char_flag=false;
    
                }
    
            }
            char_flag=false;
                }
                else if(eqn.charAt(i)<48){
    
                    char ch;
                    char tmp=eqn.charAt(i);
    
                           if(char_flag==true && tmp=='-'){
                               minus=true;
                               if(eqn.charAt(i+1)=='(')
                                   i++;
                           }
                           else if(j==0 && tmp=='-')
                           {
                               minus=true;
                               if(eqn.charAt(i+1)=='(')
                                   i++;
                           }
                           else if(tmp=='-' && eqn.charAt(i-1)=='(')
                           {
                               minus=true;
                               if(eqn.charAt(i+1)=='(')
                                   i++;
                           }
                           else if(tmp!='(' && tmp!=')')
                                char_flag=true;
    
    
                        if(minus!=true ){     
                           switch(prec(tmp))
                                    {
                                    case 1:if(i>0 && (eqn.charAt(i-1)==')' || prec(eqn.charAt(i-1))==0)){
                                        tmp='*';
                                        ch=stack.pop();
                                        while(prec(ch)>=prec(tmp))
                                        {
                                            j++;
                                            pos[j]=new Data();
                                                pos[j].ch=ch;
                                                pos[j].flag=2;
    
                                                ch=stack.pop();
                                        }
                                       stack.push(ch);
                                       stack.push(tmp);
                                       tmp='(';
    
                                    }
                                           stack.push('(');
                                           j++;
                                           pos[j]=new Data();
                                           pos[j].ch='(';
                                           pos[j].flag=3;
                                                break;
                                    case 2:
                                            ch=stack.pop();
                                            while(ch!='(')
                                            {
                                                 j++;
                                                pos[j]=new Data();
                                                    pos[j].ch=ch;
                                                    pos[j].flag=2;
    
                                                    ch=stack.pop();
    
                                            }
                                            j++;
                                               pos[j]=new Data();
                                               pos[j].ch=')';
                                               pos[j].flag=5;
    
                                               if(i+1<eqn.length() && prec(eqn.charAt(i+1))==0){
                                                tmp='*';
                                                ch=stack.pop();
                                                while(prec(ch)>=prec(tmp))
                                                {
                                                    j++;
                                                    pos[j]=new Data();
                                                        pos[j].ch=ch;
                                                        pos[j].flag=2;
    
                                                        ch=stack.pop();
                                                }
                                               stack.push(ch);
                                               stack.push(tmp);
    
    
                                            }
                                            break;
                                    case 3:
                                    case 4:
                                    case 5:
                                            ch=stack.pop();
                                            while(prec(ch)>=prec(tmp))
                                            {
                                                j++;
                                                pos[j]=new Data();
                                                    pos[j].ch=ch;
                                                    pos[j].flag=2;
    
                                                    ch=stack.pop();
                                            }
                                           stack.push(ch);
                                           stack.push(tmp);
                                            break;
                                    case 6:decimal=true;
                                    count=0;
                                    break;
                                    }
                        if(prec(tmp)!=6)
                            pos[j].num_set=true;
    
    
                }
                       else if(minus==true && eqn.charAt(i)=='('){
                           stack.push('(');
                             j++;
                            pos[j]=new Data();
                            pos[j].ch='(';
                            pos[j].flag=4;//negate inside value
                            minus=false;
                            char_flag=false;
    
                        }
                        if(prec(tmp)==6)
                            decimal=true;
                }
            }
    
         }
         Data PostEval(){
             top=-1;
            Data x = null,y=null;
            for(int k = 0;k<=j;k++){
                switch(pos[k].flag){
                case 1:push(pos[k]);
                break;
                case 2:
                    if(top>=2){                 
                    y=pop();
                    x=pop();
                    if(x.flag!=1 || y.flag!=1){
                        op.flag=1;
                        return op;
                    }
                    if(y.num==0 && pos[k].ch=='/')
                    {
                        op.flag=2;
                        return op;
                    }
                    switch(pos[k].ch)
                       {
                    case '+':
                         x.num=x.num+y.num;
                         x.flag=1;
                         push(x);
                         break;
                    case '-':
                         x.num=x.num-y.num;
                        x.flag=1;
                         push(x);
                         break;
    
                    case '*':
                         x.num=x.num*y.num;
                        x.flag=1;
                         push(x);
                         break;
                    case '/':
                         x.num=x.num/y.num;
                        x.flag=1;
                         push(x);
                         break;
                       }
                }
                    else{
    
                        op.flag=1;//syntax error
                        return op;
                    }
                break;
                case 3:
                    /*open brace,no need of negation*/
                    push(pos[k]);
    
                    break;
                case 4:
                    /*open brace,negate the value inside*/
                    push(pos[k]);
                    break;
                case 5:
                    /*close brace.
                     * negate inside data if needed*/
                    y=pop();
                    x=pop();
                    if(x==null){
                        op.flag=1;//syntax error
                        return op;
                    }
                    if(x.flag==4){
                        y.num=y.num*-1;
                        push(y);
                    }
                    else if(y.ch=='('){
                        /*empty braces.*/
                        push(x);
                    }
    
                    else
                        push(y);
    
                    break;
    
            }
            }
            if(top>0){
                op.flag=1;//syntax error
                    return op;
            }
            op=pop();
            op.flag=0;//success execution
    
            return op;
         }
    
    }
    

    这是数据模型

     public class Data {
        public double num;
        public char ch;
        public int flag;
        public boolean num_set;//defines if num contains a decimal value or not
         Data(){
            num=0;
            ch='#';
            flag=0;
            num_set=false;
        }
    }
    

    它还可以评估包括对偶在内的表达式。 例如:

    String input = "3+(5*-2)+4+(5*4)";
    

    还支持浮点操作,如

    String input = "3+2.25+(5*4)";
    

    【讨论】:

    • 这将为他的输入字符串抛出 java.lang.NumberFormatException
    • @MihaiC 我编辑了我的答案
    猜你喜欢
    • 2018-04-03
    • 1970-01-01
    • 2019-11-21
    • 2018-06-04
    • 1970-01-01
    • 2017-10-06
    • 2014-01-06
    • 1970-01-01
    相关资源
    最近更新 更多