2013-11-23 5 views
2

나는 안드로이드 계산기를 만들었고 최근에 +/- 버튼을 추가했습니다. 내가 직면하고있는 문제는 첫째로 그것을 사용할 때 등호 버튼을 누르면 앱이 충돌합니다. 또한 +/- 버튼을 클릭하면 숫자가 부동 소수점 값으로 변하고 임의의 숫자를 입력하면 숫자 값은 소수점 이하로 계속됩니다. 예 : 200을 가지고 +/-를 누르면 200.0이되고 어떤 숫자를 입력하면 200.01이됩니다. 이 문제를 어떻게 극복 할 수 있습니까? 누군가 내 코드에서 필요한 변경 사항을 알려주십시오. 여기있어. 감사합니다. :)내 안드로이드 계산기의 플러스 또는 마이너스 글리치

public class MainActivity extends Activity { 
    Typeface font1, font2; 

    TextView tv1; 
    private EditText Scr; //textbox screen 
    private float NumberBf; //Save screen before pressing button operation; 
    private String Operation; 
    private ButtonClickListener btnClick; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     requestWindowFeature(Window.FEATURE_NO_TITLE); 
     setContentView(R.layout.activity_main); 
     font1=Typeface.createFromAsset(getAssets(), "digits.ttf"); 
     Scr=(EditText)findViewById(R.id.editText); 
     Scr.setTypeface(font1); 
     font2=Typeface.createFromAsset(getAssets(), "alexbrush.TTF"); 
     tv1=(TextView)findViewById(R.id.textView1); 
     tv1.setTypeface(font2); 
     Scr = (EditText) findViewById(R.id.editText); 
     Scr.setEnabled(false); 
     btnClick = new ButtonClickListener(); 
     int idList[] = {R.id.button0,R.id.button7, R.id.button1, R.id.button8,R.id.button9,R.id.button4, 
       R.id.button5,R.id.button6,R.id.button,R.id.button2,R.id.button3,R.id.buttonDot, 
       R.id.buttonMul,R.id.buttonDiv,R.id.buttonAdd,R.id.buttonSub,R.id.buttonC, 
       R.id.buttonEq, R.id.buttonSqrt, R.id.buttonsquare, R.id.buttonNp 
     }; 

     for(int id:idList){ 
      View v = (View) findViewById(id); 
      v.setOnClickListener(btnClick); 
     } 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     getMenuInflater().inflate(R.menu.main, menu); 
     return true; 
    } 

    public void mMath(String str){ 
     NumberBf = Float.parseFloat(Scr.getText().toString()); //save the screen 
     Operation = str; //save operation 
     Scr.setText("0"); //Clear screen 
    } 

    public void getKeyboard(String str){ 
     String ScrCurrent = Scr.getText().toString(); 
     if(ScrCurrent.equals("0")) 
      ScrCurrent = ""; 
     ScrCurrent += str; 
     Scr.setText(ScrCurrent); 
    } 

    public void mResult(){ 
     float NumAf = Float.parseFloat(Scr.getText().toString()); 
     float result = 0; 
     if(Operation.equals("+")){ 
      result = NumAf + NumberBf; 
     } 
     if(Operation.equals("-")){ 
      result = NumberBf - NumAf; 
     } 
     if(Operation.equals("*")){ 
      result = NumAf * NumberBf; 
     } 
     if(Operation.equals("/")){ 
      result = NumberBf/NumAf; 
     } 
     Scr.setText(String.format("%10d", result)); 
    } 

    public void fnSqrt(){ 
     double Number = Double.parseDouble(Scr.getText().toString()); 
     Number = Math.sqrt(Number); 
     Scr.setText(String.valueOf(Number)); 
    } 

    public void fnSquare(){ 
     float Number1 = Float.parseFloat(Scr.getText().toString()); 
     Number1 = pow(Number1, 2); 
     Scr.setText(String.valueOf(Number1)); 
    } 

    public void fnNp(){ 
     float Number = Float.parseFloat(Scr.getText().toString()); 
     Number = Number*(-1); 
     Scr.setText(String.valueOf(Number)); 
     } 

    private float pow(float number1, int i) { 
     return number1*number1; 
    } 

    private class ButtonClickListener implements OnClickListener{ 
     public void onClick(View v){ 
      switch (v.getId()){ 
       case R.id.buttonC: //Clear screen 
        Scr.setText("0"); 
        NumberBf = 0; 
        Operation = ""; 
        break; 
       case R.id.buttonAdd: //function Add 
        mMath("+"); 
        break; 
       case R.id.buttonSub: 
        mMath("-"); 
        break; 
       case R.id.buttonMul: 
        mMath("*"); 
        break; 
       case R.id.buttonDiv: 
        mMath("/"); 
        break; 
       case R.id.buttonEq: 
        mResult(); 
        break; 
       case R.id.buttonSqrt: 
        fnSqrt(); 
        break; 
       case R.id.buttonNp: 
        fnNp(); 
        break;  
       case R.id.buttonsquare: 
        fnSquare(); 
        break; 
       default: 
        String numb = ((Button) v).getText().toString(); 
        getKeyboard(numb); 
        break; 
      } 
     } 
    } 
} 
+1

사이드 노트 : Java의 변수는'camelCase' 여야합니다. 경험 많은 자바 프로그래머가 'TitleCase'변수를 보는 것은 매우 혼란 스럽습니다. 우리는 이것이 클래스라고 가정합니다. –

+0

당신이하려는 일이 불분명합니다. "+/-"버튼을 하나의 버튼으로 언급 했으므로이 버튼을 사용하여 입력 신호가 무엇이든간에 기호를 변경하려고한다고 생각 하겠지만이 코드의 아무 곳에서나 해당 사례가 처리되는 것을 보지 못합니다. 당신이하려는 일입니까? – dm78

+0

public void fnNp이 함수는이 함수에 사용됩니다. – Aijaz

답변

0

귀하의 첫 번째 문제에 관해서 : 당신은 nullpointer 예외가 발생합니까?

public void mResult(){ 
    float NumAf = Float.parseFloat(Scr.getText().toString()); 

귀하의 성명서가 널 문자열을 플로트로 바꾸어 응용 프로그램이 충돌을 일으키는 것을 막을 수는 없습니다. 전에 null 값을 잡을 메커니즘을 포함하십시오.

case R.id.buttonEq: 
    if (Scr.getText() != null) 
     mResult(); 
    break; 

나는이 null 값을 받고에서 mResult()을 방지하는 가장 쉬운 방법이라고 생각합니다. 두 번째 문제에 대한

은 : 당신이 문자열로 반환됩니다 200.00이되는 유동로 (200)를 캐스팅 할 때

float Number = Float.parseFloat(Scr.getText().toString());` 

을하기 때문에 그것은 부동된다.

편집 : 도트 버튼이 있다는 것을 깨달았습니다 (코드가 정말 엉망입니다). 물론 제안 된 대체 방법은 항상 number 값을 전송하므로 10 진수로는 작동하지 않습니다. 이 행동을 막기 위해 간단한 if/else 문을 구현할 수 있습니다.

public void fnNp() { 
    if (Scr.getText().toString().contains(".")) { 
     float Number = Float.parseFloat(Scr.getText().toString()); 
     Number = Number*(-1); 
     Scr.setText(String.valueOf(Number)); 
    } else { 
     int number = Integer.parseInt(Scr.getText().toString()); 
     Number = Number*(-1); 
     Scr.setText(String.valueOf(Number)); 
    } 
} 
0

당신은 경우에 수행에 필요한 플로트 플로트의 INT의 플로트에 절대 차이보다, Float.MIN_VALUE가 말을 가지고 있는지 확인하고 다음의 있으며, toString를 얻을 수 mResult의 문 있는 경우 float의 int입니다.

함수 setScreenTextWithNumber (Number n)에서 Scr.setText (Float f) 호출을 감싸고 거기에서 확인하십시오.

소수점을 확인한 경우 원하는 경우 2.0000/2 = 1.000입니다. 그렇지 않으면 중요한 차이를 확인하면 가장 가까운 정수와 크게 다른 수는 정수가됩니다.

관련 문제