3

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

flx
  • 14,146
  • 11
  • 55
  • 70
no0bCoder
  • 95
  • 1
  • 1
  • 11

6 Answers6

24

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
}
flx
  • 14,146
  • 11
  • 55
  • 70
  • 1
    Instead of: double amount = Double.parseDouble(amt.toString()); , I had to do: double amount = new Double(amt.getText().toString());, When retrieving user input. Thanks. – gimmegimme Feb 08 '17 at 18:42
6

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);
Tom
  • 16,842
  • 17
  • 45
  • 54
Forntoh
  • 311
  • 4
  • 7
  • This answer doesn't help here, since this exception here is caused by an empty String. – Tom Jun 06 '16 at 05:42
  • 2
    Maybe this answer don't solve the question asked here, but for people who search for the same exception, need to know all the possible issues. In my case, this is the valid answer for the same exception and code. – IgniteCoders Apr 15 '19 at 16:59
3

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

   double w = new Double(input3.getText().toString());
Raghunandan
  • 132,755
  • 26
  • 225
  • 256
0

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;
    }
Aditya Naique
  • 1,120
  • 13
  • 25
0

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);
Akshay Chopra
  • 1,035
  • 14
  • 10
0
 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();
            }
Ashwin H
  • 695
  • 7
  • 24