如何从EditText解析双精度到TextView? (机器人)

时间:2011-09-19 16:39:44

标签: android parsing variables textview android-edittext

我真的开始学习Java了。 当我运行此代码时,一切正常,直到我将EditText框保留为空并点击运行按钮。然后我得到:

ERROR/AndroidRuntime(866): FATAL EXCEPTION: main
ERROR/AndroidRuntime(866): java.lang.NumberFormatException: 
ERROR/AndroidRuntime(866):     at org.apache.harmony.luni.util.FloatingPointParser.parseDouble(FloatingPointParser.java:267)

我想当我尝试从字符串解析Double时,它没有获得任何值并产生错误。 我想知道如何避免这个错误,并给变量赋予某种值,所以它永远不会是空的?谢谢你的帮助!

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

public class Main extends Activity {

    private EditText noKids;
    private EditText noGumballs;
    private TextView noSum;
    private Button b;
    private Button br;
    double etKids = 0;
    double etGumballs = 0;
    private double tvSumIn = 0.00;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        initControls();
    }


    private void initControls() {
        noKids = (EditText) findViewById(R.id.xetKids);
        noGumballs = (EditText) findViewById(R.id.xetGumballs);
        noSum = (TextView) findViewById(R.id.tvSum);


        br = (Button) findViewById(R.id.xbtnReset);
        br.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                reset();
                br.setVisibility(View.INVISIBLE);
            }

            private void reset() {
                noKids.setText("");
                noGumballs.setText("");
                noSum.setText("");

            }

        });

        b = (Button) findViewById(R.id.xbtnCalculate);
        b.setOnClickListener(new OnClickListener() {
            public void onClick(View v) {               
                calculate();
                br.setVisibility(View.VISIBLE);
                }

        private void calculate() {

            etKids = Double.parseDouble(noKids.getText().toString());
            etGumballs = Double.parseDouble(noGumballs.getText().toString());
            tvSumIn = etGumballs / etKids; 
            String thisIsIt = new Double(tvSumIn).toString();

            if(tvSumIn < 2){
                noSum.setText(thisIsIt + " This is it ");
            }else{
                noSum.setText("This is else");
            }

        }

        });



        }
    }

这是我的main.xml文件 而且我猜测没有什么特别可以表现出来。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
    <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="How many kids have you got?"></TextView>
    <EditText android:layout_width="match_parent" android:layout_height="wrap_content" android:inputType="number" android:id="@+id/xetKids">
        <requestFocus></requestFocus>
    </EditText>
    <TextView android:id="@+id/textView2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="How many gumballs have you got?"></TextView>
    <EditText android:layout_width="match_parent" android:layout_height="wrap_content" android:inputType="number" android:id="@+id/xetGumballs"></EditText>
    <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Calculate" android:id="@+id/xbtnCalculate"></Button>
    <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/tvSum"></TextView>
    <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/xbtnReset" android:text="Reset" android:onClick="selfDestruct" android:visibility="invisible"></Button>
</LinearLayout>

9 个答案:

答案 0 :(得分:17)

这是java.lang.Double类的JavaDoc,parseDouble方法:

/**
 * Parses the specified string as a double value.
 * 
 * @param string
 *            the string representation of a double value.
 * @return the primitive double value represented by {@code string}.
 * @throws NumberFormatException
 *             if {@code string} is {@code null}, has a length of zero or
 *             can not be parsed as a double value.
 * @since Android 1.0
 */

空值不被视为可解析。这就是你得到这个例外的原因。

您可以对代码进行额外检查,以查看noKids EditText中的字符串是否为空,如果是,则手动将值设置为0.0:

noKidsStr = noKids.getText().toString();

if(noKidsStr == null || noKidsStr.isEmpty()) {

  etKids = 0.0;

} else {

  etKids = Double.parseDouble(noKids.getText().toString());

}

我建议你写一些方便实用的方法,你可以在将来为所有类似的情况重复使用。

答案 1 :(得分:4)

你应该在try / catch子句中包装Double.parseDouble ..语句,以捕获任何NumberFormatExceptions,并设置其失败的其他值

编辑:

try{
    etKids = Double.parseDouble(noKids.getText().toString());
} catch (final NumberFormatException e) {
    etKids = 1.0;
}
try{
    etGumballs = Double.parseDouble(noGumballs.getText().toString());
} catch (final NumberFormatException e) {
    etGumballs = 1.0;
} 

答案 2 :(得分:2)

你可以做两件事: 首先,只允许EditText字段中的数字数据。实际上,我看到你已经这样做了。 我通常使用android:numeric - 这是我见过的第一个android:inputType。感谢那。 =)

其次,通过简单的检查确保EditText中有文本。

if(noKids.getText().length() > 0)
{
    etKids = Double.parseDouble(noKids.getText().toString());
}

答案 3 :(得分:0)

这是一个java问题,而不是android问题。

您应该在代码中处理NumberFormat异常。如果有人在文本框中输入“abc”会怎么样?您希望自己的应用做什么?您可以使用try / catch块处理异常:http://tutorials.jenkov.com/java-exception-handling/basic-try-catch-finally.html

您可能还想在尝试转换之前检查noKids.getText()。toString()是否为空。如果字符串是“”vs,如果字符串是“abc”,那么对用户有不同的反馈可能是有意义的。

答案 4 :(得分:0)

private void calculate() {
         try{
            etKids = Double.parseDouble(noKids.getText().toString());
            etGumballs = Double.parseDouble(noGumballs.getText().toString());
            tvSumIn = etGumballs / etKids; 
          }catch(exception e)
          {
            e.printStackTrace():
          }    
        String thisIsIt = new Double(tvSumIn).toString();

            if(tvSumIn < 2){
                noSum.setText(thisIsIt + " This is it ");
            }else{
                noSum.setText("This is else");
            }

        }

答案 5 :(得分:0)

另一项改进:

String thisIsIt = new Double(tvSumIn).toString();

if(tvSumIn < 2){
    noSum.setText(thisIsIt + " This is it ");
}else{
    noSum.setText("This is else");
}

可能是:

if(tvSumIn < 2){
    noSum.setText(tvSumIn + " This is it ");
}else{
    noSum.setText("This is else");
}

然后您不必创建无用的字符串

答案 6 :(得分:0)

我认为检查值是否正确的最佳方法如下:

   noKidsStr = noKids.getText().toString();

   try
   {
      etKids = Double.parseDouble(noKids.getText().toString());
   }
   catch (NumberFormatException e)
   {
      //Here request a valid value
      Toast.makeText(getBaseContext(), "value is not valid", Toast.LENGTH_LONG).show();
      noKids.requestFocus();
      return;

      //Or you can add a value

    }
}

我认为这种方法更优雅,并考虑了他们添加的任何类型的输入。 BR, 阿德里安。

答案 7 :(得分:0)

试试这段代码 TextView_object.setText(new Double(sum).toString());

答案 8 :(得分:0)

延伸到弗拉德米尔的帖子(我不能对该特定的帖子添加评论)

您可以使用以下两行而不是if / else块(在某些情况下使用?等同于if / else)时可以做到这一点。

noKidsStr = noKids.getText().toString();

etKids = (noKidsStr == null || noKidsStr.isEmpty())?0.0:Double.parseDouble(noKids.getText().toString());