Android EditText处理String.valueOf(double)总是在输入等于&#34时给出NaN; "

时间:2015-04-16 04:51:16

标签: android

有3个EditText,第一个价格输入,第二个百分比,第三个结果。我正在尝试使用onFocusChangeListener计算EditText输入。 守则:

etPercen.setOnFocusChangeListener(new View.OnFocusChangeListener() {
            @Override
            public void onFocusChange(View v, boolean hasFocus) {

                if (!hasFocus) {
                    OnFocusChangedPercenCalculator();
                }
            }
        });

        etresult.setOnFocusChangeListener(new View.OnFocusChangeListener() {
            @Override
            public void onFocusChange(View v, boolean hasFocus) {

                if (!hasFocus) {
                    OnFocusChangedResultCalculator();
                }
            }
        });

public void OnFocusChangedPercenCalculator() {
        String text1 = String.valueOf(etPrice.getNumericValue()).toString();
        String text2 = etPercen.getText().toString();
        String text3 = String.valueOf(etresult.getNumericValue()).toString();
        double input1 = 0;
        double input2 = 0;
        int i = 0;
        if (text1.length() > 0 || text2.length() > 0 || text3.length() > 0)
            input1 = Double.parseDouble(text1);
        input2 = Double.parseDouble(text2);

        if (text1.length() != 0 ){
            if(text2.length() != 0) {
                double output = (input1 * input2) / 100;
                e = String.valueOf(output);
                etresult.setText("" + e);
            } else if (text2.length() ==0 || text2.matches("")){
                etresult.setText(i+"");
            }
        }else if(text1.length() == 0){
            if(text2.length() != 0) {
                etresult.setText(i+"");
        } else if (text2.length() ==0 || text2.matches("")){
            etresult.setText(i+"");
        }
        }
    }

    public void OnFocusChangedResultCalculator() {
        String text1 = String.valueOf(etPrice.getNumericValue()).toString();
        String text2 = etPercen.getText().toString();
        String text3 = String.valueOf(etresult.getNumericValue()).toString();
        double input1 = 0;
        double input3 = 0;
        int i = 0;
        if (text1.length() > 0 || text2.length() > 0 || text3.length() > 0)
            input1 = Double.parseDouble(text1);
        input3 = Double.parseDouble(text3);

        if (text1.length() != 0 ){
            if(text3.length() != 0) {
                double output = (input3 / input1) * 100;
                e = String.valueOf(output);
                etPercen.setText("" + e);
            } else if (text3.length() ==0 || text3.matches("")){
                etPercen.setText(i);
            }
        }else if(text1.length() == 0){
            if(text3.length() != 0) {
                etPercen.setText(i);
        } else if (text3.length() ==0 || text3.matches("")){
            etPercen.setText(i);
        }
        }else if (input3 > input1){
            etPercen.setText(100);
        }
    }

我想要做的是第二和第三个EditTexts互相看。我的意思是当用户从第2个/第3个editText更改焦点时,计算将立即开始。想法是让第二个计算并将结果放在第三个并使第三个计算并将结果放在第二个。这取决于用户是否想要更改填充/更改值(假设价格为10000,用户想要了解其中的20%,或者用户想要反过来,那么% 20000从10000)。这是我的期望,但是当我们清空第一和第三个edittext时,第二个的输出将是NaN。怎么办呢?我的意思是避免结果成为NaN?

3 个答案:

答案 0 :(得分:2)

好的,我重构了第二种方法来说明我在谈论的内容。应该工作。

      public void OnFocusChangedResultCalculator() {
        String text1 = etPrice.getText().toString().trim();
        String text2 = etPercen.getText().toString().trim();
        String text3 = etresult.getText().toString().trim();
        double input1 = text1.length()>0 ? Double.parseDouble(text1) : 0;
        double input3 = text3.length()>0 ? Double.parseDouble(text3) : 0;

        if (input3 > input1){
            etPercen.setText(100);
            return;
        }

        double output = (input3 / input1) * 100;
        etPercen.setText(output);
    }

<强>更新

public void OnFocusChangedResultCalculator() {
        String text1 = String.valueOf(etPrice.getNumericValue()).toString().trim();
        String text2 = etPercen.getText().toString().trim();
        String text3 = String.valueOf(etresult.getNumericValue()).toString().trim();
        double input1 = text1.length()>0 ? Double.parseDouble(text1) : 0;
        double input3 = text3.length()>0 ? Double.parseDouble(text3) : 0;

        if (input3 > input1){
            etPercen.setText(Integer.toString(100));
            etresult.setText(Double.toString(input1));
            return;
        }

        double output = (input3 / input1) * 100;
        etPercen.setText(Double.toString(output));
    }

答案 1 :(得分:1)

NaN错误只是非数字。 我认为你需要改变你的状况

 if (text1.length() != 0 )

if (text1.length() > 0 )

如果长度为-1或1,则仍然满足条件。 通过使用运算符&gt;而不是!=你会得到保证 text1不为空。

答案 2 :(得分:1)

你正在获得NaN,因为&#34;&#34;和&#34; &#34;不是一个数字 而不是使用

if (text1.length() != 0 )

使用

if(!TextUtils.isEmpty(text1.toString().trim()))

这是一个android String实用程序,用于对任何String执行null和empty检查。 你也可以在你的布局xml中提到你的inputType是数字