如何解决 android (java) 中的退格错误

how do I resolve backspace error in android (java)

我正在 java 中制作一个计算器应用程序。我添加了退格键功能,它在屏幕上显示正常,但是当计算完成后,它显示一些 random value.

示例:-

input-1 : 963, input-2 : 78 但我按退格键删除了 8。
操作: input-1 + input-2.
答案: 14.

input-1 : 956, input-2 : 48 但我按退格键删除了 8。
操作: input-1 + input-2.
答案: 8.

如果我使用减法运算(带退格键),那么它总是 returns 0.

这是我的 backspace

代码
   private String input, input2 ;
   private Double input_number;

   boolean Addition, Subtract, Multiplication, Division, mRemainder, decimal, add_sub;

            num_backspace.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String sample_input = (num_input.getText() + "");
                input = sample_input.substring(0, sample_input.length() - 1);
                num_input.setText(input);

                if (input.contains(".")){
                    decimal = true;
                }
                else{
                    decimal = false;
                }
            }
        });

这是我的 equals

代码
            num_equals.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (Addition || Subtract || Multiplication || Division || mRemainder) {
                    input2 = (num_input.getText() + "");
                }

                if (Addition) {

                    float final_input = Float.parseFloat(input);
                    float final_input2 = Float.parseFloat(input2);
                    num_input.setText(new Float(final_input + final_input2 + "").toString().replaceAll("\.?0*$", ""));
                    num_output.setText(new Float(final_input + final_input2 + "").toString().replaceAll("\.?0*$", ""));
                    Addition = false;
                }

                if (Subtract) {

                   float final_input = Float.parseFloat(input);
                    float final_input2 = Float.parseFloat(input2);
                    num_input.setText(new Float(final_input - final_input2 + "").toString().replaceAll("\.?0*$", ""));
                    num_output.setText(new Float(final_input - final_input2 + "").toString().replaceAll("\.?0*$", ""));
                    Subtract = false;
                }

                if (Multiplication) {

                    float final_input = Float.parseFloat(input);
                    float final_input2 = Float.parseFloat(input2);
                    num_input.setText(new Float(final_input * final_input2 + "").toString().replaceAll("\.?0*$", ""));
                    num_output.setText(new Float(final_input * final_input2 + "").toString().replaceAll("\.?0*$", ""));
                    Multiplication = false;
                }

                if (Division) {
                    float final_input = Float.parseFloat(input);
                    float final_input2 = Float.parseFloat(input2);
                    num_input.setText(new Float(final_input / final_input2 + "").toString().replaceAll("\.?0*$", ""));
                    num_output.setText(new Float(final_input / final_input2 + "").toString().replaceAll("\.?0*$", ""));
                    Division = false;
                }
                if (mRemainder) {

                    float final_input = Float.parseFloat(input);
                    float final_input2 = Float.parseFloat(input2);
                    num_input.setText(new Float(final_input % final_input2 + "").toString().replaceAll("\.?0*$", ""));
                    num_output.setText(new Float(final_input % final_input2 + "").toString().replaceAll("\.?0*$", ""));
                    mRemainder = false;
                }
            }
        });

如果需要,可以在此处查看完整代码

https://github.com/vendz/Calculator/blob/master/app/src/main/java/com/example/calculator/MainActivity.java

您好,您要在点击 backpress 时重置 input 字段,将您的 backpress 代码更改为下面的代码,它将起作用

num_backspace.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String sample_input = (num_input.getText() + "");
                String mInput = sample_input.substring(0, sample_input.length() - 1);
                num_input.setText(mInput);

                if (mInput.contains(".")){
                    decimal = true;
                }
                else{
                    decimal = false;
                }
            }
        });

这里一般有4个按钮。

  1. 019:在num_input
  2. 上加数字
  3. +,将num_input分配给input。清除 num_input
  4. <-, input = num_input.substring(0, n-1)
  5. =,将num_input分配给input2

问题是,退格键可能发生在选择操作之前或之后。但是,退格键总是从 num_input 中减去字符串。同时,num_input 可能是 inputinput2 的数据来源(参见第 2 和 4 部分)。 如果我输入这个序列 4 0 + 1 2 <- =。应该是40+1=。但在 <- 期间实际发生的是将 1 覆盖为 input 而不是 input2。这就是为什么根据您的示例,错误答案 = 第二个数字 + 第二个数字。

输入 2 : 78 , 答案 = 7 + 7 = 14

input-2 : 48 ,answer = 4 + 4 = 8

此外,我有一些建议阅读您的问题。它们不是必需的,可能与问题没有直接关系,只是一般编程中的一些建议。

  1. 不要将数字存储为字符串。您不需要通过从 TextView 中提取它来获取计算器当前保存的数值。你有你的 input_number ,其中包含数字的真实值。将其作为最准确的来源,并将 TextView 仅视为一种表示形式。反其道而行之可能不是一个好主意。字符串操作和解析不是很安全(解析错误)。而且,这对我来说听起来是一个额外的步骤。
  2. 加法、减法、乘法、除法。命令模式的一个很好的展示。你不想写很长的if。这对可维护性不利。考虑到以后你可能会在计算器中添加更多的功能,sin, cos, log, power 等。很快代码就会变得凌乱。
  3. 为什么 (num_input.getText() + "")getText() return 字符串,不需要隐式转换
  4. num_period 设置 onclick 侦听器。