在我的Android计算器中加上或减去小故障

时间:2013-11-23 20:07:59

标签: java android eclipse calculator

我已经制作了一个Android计算器,最近我添加了+/-按钮。我面临的问题是,首先当我使用它时,按下相等的按钮,应用程序崩溃。此外,只要单击+/-按钮,数字就会变为浮点值,当我键入任何数字时,数字值会在小数点后继续。示例:我有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;
            }
        }
    }
}

2 个答案:

答案 0 :(得分:0)

关于你的第一个问题:你得到一个nullpointer异常吗?

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

不会阻止你的语句尝试将一个空字符串变成一个浮点数,这显然会让你的应用程序崩溃。因此,请包含一种在之前捕获空值的机制。

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

我认为这是阻止mResult()获取空值的最简单方法。

对于你的第二个问题:因为你做了

,它变成了浮动
float Number = Float.parseFloat(Scr.getText().toString());`

当您将200投射到浮动中时,它变为200.00,将作为字符串返回。

编辑:我意识到你也有一个dotButton(你的代码非常混乱)。当然,建议的替代方法不适用于十进制数,因为它总是会转换您的number值。为了防止这种行为,你可以实现一个简单的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));
    }
}

答案 1 :(得分:0)

你需要在mResult中做一个if语句来检查float是否与float的int的float有一个绝对差值,小于Float.MIN_VALUE,然后得到float的int的toString相反,如果是。

在函数setScreenTextWithNumber(Number n)中包含调用Scr.setText(Float f) 并在那里检查。

如果您只是检查小数点,那么2.0000 / 2 = 1.000,如果这是你想要的。 否则,检查显着差异会产生一个调用,即与最接近的整数没有显着差异的数字是整数。