Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/212.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何将字符串转换为双安卓计算器应用程序_Java_Android - Fatal编程技术网

Java 如何将字符串转换为双安卓计算器应用程序

Java 如何将字符串转换为双安卓计算器应用程序,java,android,Java,Android,我想建立计算器,所以我要求我得到字符串变量转换为双精度 字符串输入=“3+5*-2+4”; 双输入2//输入到3+5*-2+4 我想将字符串转换为double,谢谢。试试这段代码。 TextView textView=(TextView)findViewById(R.id.textview1); String input = "3+5*-2+4"; input=input+")"; Calc calc=new Calc(); calc.InfPos(str

我想建立计算器,所以我要求我得到字符串变量转换为双精度

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


我想将字符串转换为double,谢谢。

试试这段代码。

    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);
    }
这是计算类

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;
     }

}
它还可以计算包括意合在内的表达式。 例如:

String input = "3+(5*-2)+4+(5*4)";
还支持浮动polint操作,如

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

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
}

我不知道如何解决这个问题(这将为他的输入抛出java.lang.NumberFormatExceptionstring@MihaiC我编辑了我的答案
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
}