Създаване на dot-функция за android калкулатор

Правя малък проект, събирам произволни кодове за калкулатори от мрежата и ги подобрявам, за да науча разработката на Java и Android...

И така, в момента се опитвам да внедря точка-функция за този код на калкулатора, но тя не работи както трябва. Вместо да добави точка, той добавя стойността 46 (защо 46??). Бихте ли ми помогнали да създам функционална точкова функция?

Java код:

package com.example.Elof_Calculator;



  import android.os.Bundle;
  import android.app.Activity;
  import android.view.Menu;
  import android.view.View;
  import android.widget.Button;
  import android.widget.EditText;

  public class MainActivity extends Activity {

   public String str ="";
   Character op = 'q';
   double i,num,numtemp;
      EditText showResult;
      @Override
      public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    showResult = (EditText)findViewById(R.id.result_id);


   }
  public void btn1Clicked(View v){
   insert(1);

  }

   public void btn2Clicked(View v){
   insert(2);

  }
  public void btn3Clicked(View v){
   insert(3);

  }
  public void btn4Clicked(View v){
   insert(4);

  }
  public void btn5Clicked(View v){
   insert(5);

  }
  public void btn6Clicked(View v){
   insert(6);
  }
  public void btn7Clicked(View v){
   insert(7);

  }
  public void btn8Clicked(View v){
   insert(8);

  }
  public void btn9Clicked(View v){
   insert(9);

  }
  public void btn0Clicked(View v){
      insert(0);

     }
  public void btndotClicked(View v){
      insert('.');
      //error

     }
  public void btnplusClicked(View v){
   perform();
   op = '+';

  }

   public void btnminusClicked(View v){
      perform();
     op = '-';

  }
  public void btndivideClicked(View v){
   perform();
   op = '/';

  }
  public void btnmultiClicked(View v){
   perform();
   op = '*';

  }
  public void btnequalClicked(View v){
   calculate();

  }

   public void btnclearClicked(View v){
   reset();
  }
  private void reset() {
    // TODO Auto-generated method stub
  str ="";
  op ='q';
  num = 0;
  numtemp = 0;
  showResult.setText("");
  }
 private void insert(int j) {
    // TODO Auto-generated method stub
   str = str+Integer.toString(j);
   num = Integer.valueOf(str).intValue();
   showResult.setText(str);


  }
     private void perform() {
    // TODO Auto-generated method stub
    str = "";
    numtemp = num;
     }
      private void calculate() {
     // TODO Auto-generated method stub
     if(op == '+')
    num = numtemp+num;
   else if(op == '-')
    num = numtemp-num;
   else if(op == '/')
    num = numtemp/num;
   else if(op == '*')
    num = numtemp*num;
   showResult.setText(""+num);
     }

    }

XML код за бутона с точка:

 <Button
            android:id="@+id/Btndot_id"
            style="?android:attr/buttonStyleSmall"
            android:layout_width="70dp"
            android:layout_height="64dp"
            android:background="@drawable/buttonstyle1"
            android:gravity="center_vertical|center_horizontal"
            android:text="."
            android:textColor="@android:color/white"
            android:textSize="22sp" 
             android:onClick="btndotClicked"
            />

Ето функцията на Java и кода за dot-функцията конкретно, което е основната грешка:

 public void btndotClicked(View v){
      insert('.');


     }

И така, какъв трябва да бъде кодът за функцията точка? Цялата помощ се оценява :))


person Chewie    schedule 01.06.2014    source източник
comment
Съвет: 46 е ascii стойността за знака '.' :)   -  person matiash    schedule 01.06.2014
comment
@matiash ох разбирам хаха :)) Опитах с insert(.), insert(.), str += . и някои други, но никой не работи :(   -  person Chewie    schedule 01.06.2014


Отговори (1)


Проблемът е, че вашата функция за вмъкване има подпис void insert(int j)

В Java ще се извърши имплицитно разширяващо преобразуване, ако използвате char примитивен тип, когато се очаква int тип. Така например това е валидна Java:

int dot = '.';

Въпреки това, стойността на int променливата dot сега ще бъде 46, което се оказва цяло число, което съответства на битовия модел, който се използва за представяне на '.'.

Това, което можете да направите, е да промените вашата insert функция да приема String параметри и да добавите претоварване за int параметри. Ще трябва също да промените логиката си около num, тъй като вече можете да имате числа с плаваща запетая.

private void insert(int value) {
    insert(Integer.toString(value));
    ...
    num = Double.parseDouble(str);
}

private void insert(String value) {        
    ...
}

...

public void btndotClicked(View v){
    insert("."); // inserting a String instead of a char
}
person cyon    schedule 01.06.2014
comment
Благодаря много, сега работи много по-добре! :D обаче, когато опитах например 6.6 * 6, резултатът стана 39,5999999994 вместо само 39.6 Защо? :/ С някои стойности не прави това (напр. 2,4*2 = 4,8) - person Chewie; 01.06.2014
comment
@Chewie Това е така, защото някои стойности с плаваща запетая могат да бъдат представени приблизително само в 64-битово двойно. Това е жалко и е източник на много объркване. Разгледайте тази статия floating-point-gui.de - person cyon; 01.06.2014