2014-11-20 2 views
-1

Я хочу построить калькулятор, так что я спрашиваю, что я получаю переменный тип String для преобразования в удвоенииКак бросить строку двойного андроида калькулятор App

входа String = «3 + 5 * -2 + 4»; Двойной вход2; // ввод в 3 + 5 * -2 + 4;

Я хочу конвертировать double из String, спасибо.

+0

Я не знаю, как решить это. :( – Tamer

ответ

0

Попробуйте этот код.

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

Он также может вычислять выражения, включая parathesis. например:

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

поддерживает также операции с плавающей polint как

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

, который выкинет java.lang.NumberFormatException для своей строки ввода – MihaiC

+0

@MihaiC я отредактировал мой ответ – Darish

1

ОП хочет перевести строку математики в результате. Поэтому он хочет, чтобы ввести, например, «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 
} 
Смежные вопросы