getting an error of invalid Double java.lang.numberformatexception invalid double: "" what is the reason for this

Activity 1

package com.example.solarcalculator;

        import android.os.Bundle;
        import android.widget.Button;
        import android.annotation.SuppressLint;
        import android.app.Activity;
        import android.view.Menu;
        import android.view.View;
        import android.view.View.OnClickListener;
        import android.widget.EditText;
        import android.app.AlertDialog;
        import android.content.Intent;

        @SuppressLint("UseValueOf")
        public class MainActivity extends Activity {
            private EditText input1;
            private EditText input2;
            private EditText input3;
            private EditText input4;
            private EditText input5;
            private MainActivity mContext;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mContext = this;
        setContentView(R.layout.activity_main);

        input5 = (EditText) findViewById(R.id.input5);
        Button button1 = (Button) findViewById(R.id.button1);
        input4 = (EditText) findViewById(R.id.input4);
        input1 = (EditText) findViewById(R.id.input1);
        input2 = (EditText) findViewById(R.id.input2);
        input3 = (EditText) findViewById(R.id.input3);
        button1.setOnClickListener(new OnClickListener() {

            @SuppressWarnings("unused")
            private AlertDialog show;

            @SuppressLint("UseValueOf")
            @Override
            public void onClick(View arg0) {
                if (  (input4.getText().toString() == " ") 
                        || (input4.getText().length() ==0) ||
                                                (input5.getText().length() == 0)                         
                        || (input5.getText().toString() == " ")){
                show = new      AlertDialog.Builder(mContext).setTitle("Error")
                            .setMessage("Some inputs are empty")
                            .setPositiveButton("OK", null).show();
                }
    else if ((input1.getText().length() != 0) &&
        (input3.getText().length() ==0) && (input2.getText().length() ==    0)){
                     double w = new Double(input3.getText().toString());
                     double t = new Double(input4.getText().toString());
                     double x = new Double(input5.getText().toString());
                     float e = 7;
                     double num = 1000*x;
                     double den = w*t*e;
                     double payback = num/den;
                     double money = w*t*e/1000;
         Intent intent = new Intent(MainActivity.this, Power.class);
                     intent.putExtra("payback", payback);
                     intent.putExtra("money", money);
                     startActivity(intent);

                }
    else if ((input1.getText().length() == 0) &&   (input3.getText().length() != 0) &&
                                (input2.getText().length() != 0)){
                     double t = new    
                                     Double(input4.getText().toString());
                     double x = new Double(input5.getText().toString());
                     double v = new Double(input2.getText().toString());
                     double i = new Double(input3.getText().toString());
                     float e = 7;
                     double num = 1000*x;
                     double den = v*i*t*e;
                     double payback = num/den;
                     double money = v*i*t*e/1000;
             Intent intent = new Intent(MainActivity.this, Power.class);
                     intent.putExtra("payback", payback);
                     intent.putExtra("money", money);
                     startActivity(intent);

                }
                else {
                    double t = new Double(input4.getText().toString());
                     double x = new Double(input5.getText().toString());
                     double v = new Double(input2.getText().toString());
                     double i = new Double(input3.getText().toString());
                     float e = 7;
                     double num = 1000*x;
                     double den = v*i*t*e;
                     double payback = num/den;
                     double money = v*i*t*e/1000;
               Intent intent = new Intent(MainActivity.this, Power.class);
                     intent.putExtra("payback", payback);
                     intent.putExtra("money", money);
                     startActivity(intent);

                }
            }
        });

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

       }

Activity2

package com.example.solarcalculator;

    import android.annotation.SuppressLint;
    import android.app.Activity;
    import android.os.Bundle;
    import android.widget.TextView;
   @SuppressLint("NewApi")
     public class Power extends Activity {

private double money;
private double payback;

@SuppressLint("NewApi")
@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.power);
    payback = getIntent().getDoubleExtra("payback",0);
    money = getIntent().getDoubleExtra("money", 0);
    TextView pay = (TextView) findViewById(R.id.textView2);
    String payback1 = Double.toString(payback);
    pay.setText(payback1);
    TextView mon = (TextView) findViewById(R.id.textView4);
    String money1 = Double.toString(money);
    mon.setText(money1);

     }
    }

I am getting java.lang.numberformatexception invalid double: "" error in logcat anyone please help

Solution 1

The reason is, that "" is not a valid double. You need to test the String before or catch such exceptions

double w;

try {
    w = new Double(input3.getText().toString());
} catch (NumberFormatException e) {
    w = 0; // your default value
}

Solution 2

The value of the double depends on the language of the device.For example, for devices in french the number 0.179927 becomes 0,179927 which will always throw a NumberFormatException when parsing it to double because of the comma.

You need to change the separator from a comma to a point. You can change the separator either by setting a locale or using the DecimalFormatSymbols.

If you want the grouping separator to be a point, you can use a european locale:

NumberFormat nf = NumberFormat.getNumberInstance(Locale.GERMAN);
DecimalFormat df = (DecimalFormat)nf;

Alternatively you can use the DecimalFormatSymbols class to change the symbols that appear in the formatted numbers produced by the format method. These symbols include the decimal separator, the grouping separator, the minus sign, and the percent sign, among others:

DecimalFormatSymbols otherSymbols = new DecimalFormatSymbols(currentLocale);
otherSymbols.setDecimalSeparator(',');
otherSymbols.setGroupingSeparator('.'); 
DecimalFormat df = new DecimalFormat(formatString, otherSymbols);

Solution 3

You should do as below. Put it inside a try catch block

   double w = new Double(input3.getText().toString());

Solution 4

Better to also test for .equals("") along with null.

Consider you have an afterTextChanged listener on an EditText. When you back press and clear the entered text, it'll pass != null, but still have "".

This worked for me:

    double myDouble;

    String myString = ((EditText) findViewById(R.id.editText1)).getText().toString();

    if (myString != null && !myString.equals("")) {
        myDouble = Double.valueOf(myString);
    } else {
        myDouble = 0;
    }

Solution 5

Basically, you need to test whether the string that you want to convert into double is empty or not.

If it is empty, then you can just initialise it with some value and then proceed further.

For example:

if(myString.isEmpty()){
myString = ""+0.0;
}
double answer = Double.parseDouble(myString);

Solution 6

 double latitude;
            double longitude;
            try {
                latitude = Double.parseDouble(mApoAppointmentBeanList.get(position).getLatitude());
                longitude = Double.parseDouble(mApoAppointmentBeanList.get(position).getLongitude());

                String uri = String.format(Locale.ENGLISH, "http://maps.google.com/maps?q=loc:%f,%f", latitude, longitude);
                Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(uri));
                startActivity(intent);

            } catch (NumberFormatException e) {
                // your default value
                Toast.makeText(AppointmentsActivity.this, "Invalid location", Toast.LENGTH_LONG).show();
            }