How to parse a double from EditText to TextView? (

2019-01-19 03:07发布

I'm realy beginning to learn Java. When I run this code everything works fine till I leave my EditText boxes in the from empty and hit the run button. Then I get:

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)

I guess when I try to parse a Double from string it doesn't get any value and creates an error. I was wondering how to avoid this error and give some kind of a value to the variable so it is never empty? Thanks for all the help!

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");
            }

        }

        });



        }
    }

This is my main.xml file and I'm guessing there's nothing special to put into manifest.

<?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条回答
We Are One
2楼-- · 2019-01-19 03:21

Here is the JavaDoc for java.lang.Double class, parseDouble method:

/**
 * 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
 */

Empty values are not considered to be parseable. That's why you get this exception.

You can intoduce an additional check to your code to see if string in the noKids EditText is empty and if so, manually set the value to 0.0:

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

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

  etKids = 0.0;

} else {

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

}

I suggest writing some sort of convenience utility method that you can re-use for all similar situations in the future.

查看更多
放我归山
3楼-- · 2019-01-19 03:21

Extending on Vladmir's post (I cannot add a comment to that specific one)

you can have a short hand of that using the following two lines instead of the if/else block (? is the equivalent of if/else, when used in certain situations)

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

etKids = (noKidsStr == null || noKidsStr.isEmpty())?0.0:Double.parseDouble(noKids.getText().toString());
查看更多
时光不老,我们不散
4楼-- · 2019-01-19 03:23

This is a java question, not an android question.

You should handle the NumberFormat exception in your code. What happens if somebody enters "abc" into the text box? What do you want your app to do? You handle exceptions using try/catch blocks: http://tutorials.jenkov.com/java-exception-handling/basic-try-catch-finally.html

You might also want to check if noKids.getText().toString() is empty before trying to convert it. It might make sense for there to be a different feedback to the user if the string is "" vs if the string is "abc".

查看更多
放我归山
5楼-- · 2019-01-19 03:24

you should wrap the Double.parseDouble.. statements in a try/catch clause, to catch any NumberFormatExceptions, and set other values where they fail

edit:

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;
} 
查看更多
【Aperson】
6楼-- · 2019-01-19 03:26

Try this code TextView_object.setText(new Double(sum).toString());

查看更多
兄弟一词,经得起流年.
7楼-- · 2019-01-19 03:27

I think the best way to check if the value is correct is as follows:

   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

    }
}

I think this method is more elegant and takes into account any kind of input they add. BR, Adrian.

查看更多
登录 后发表回答