Reputation: 4050
i have 5 textedits for numbers and a button. when the button is clicked the app calculates a different equation based on which field was left empty. however the app keeps crashing when i leave multiple fields empty with the error that the first double in the first if statement is invalid.
idea of the code
if (first field.getText().toString().equals("")) {...}
else if (second field.getText().toString().equals("")) {...}
else if (third field.getText().toString().equals("")) {...}
else if (fourth field.getText().toString().equals("")) {...}
else if (fifth.getText().toString().equals("")) {...}
else {...}
basically the last one should just give a toast for if it isn't any of the above (2-5 empties, 0 empties
real syntax is this:
calc.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
EditText fv = (EditText) findViewById(R.id.pv_fv);
EditText pv = (EditText) findViewById(R.id.pv_pv);
EditText r = (EditText) findViewById(R.id.pv_discountrate);
EditText n = (EditText) findViewById(R.id.pv_periods);
EditText t = (EditText) findViewById(R.id.pv_years);
if (fv.getText().toString().equals("")) {
double r1 = Double.parseDouble(r.getText().toString());
double n1 = Double.parseDouble(n.getText().toString());
double t1 = Double.parseDouble(t.getText().toString());
double pv1 = Double.parseDouble(pv.getText().toString());
double answer1 = pv1*(Math.pow(1+(r1/n1) ,n1*t1 ));
answer1 = (double)(Math.round(answer1*100))/100;
TextView answer = (TextView) findViewById(R.id.pv_answer);
answer.setText("The Future Value of the cash flow is: "+answer1);
}
else if (pv.getText().toString().equals("")) {
double fv1 = Double.parseDouble(fv.getText().toString());
double r1 = Double.parseDouble(r.getText().toString());
double n1 = Double.parseDouble(n.getText().toString());
double t1 = Double.parseDouble(t.getText().toString());
double answer1 = fv1/(Math.pow(1+(r1/n1) ,n1*t1 ));
answer1 = (double)(Math.round(answer1*100))/100;
TextView answer = (TextView) findViewById(R.id.pv_answer);
answer.setText("The Present Value of the cash flow is: "+answer1);
}
else if (r.getText().toString().equals("")){
double fv1 = Double.parseDouble(fv.getText().toString());
double pv1 = Double.parseDouble(pv.getText().toString());
double n1 = Double.parseDouble(n.getText().toString());
double t1 = Double.parseDouble(t.getText().toString());
double answer1 = ( (Math.pow(fv1/pv1, 1/(n1*t1) ) ) -1)*n1 ;
answer1 = (double)(Math.round(answer1*100))/100;
TextView answer = (TextView) findViewById(R.id.pv_answer);
answer.setText("The discount rate / interest rate applied is: "+answer1);
}
else if (t.getText().toString().equals("")){
double fv1 = Double.parseDouble(fv.getText().toString());
double pv1 = Double.parseDouble(pv.getText().toString());
double n1 = Double.parseDouble(n.getText().toString());
double r1 = Double.parseDouble(r.getText().toString());
double answer1 = Math.log(fv1/pv1) / (n1* Math.log(1+(r1/n1) ) ) ;
answer1 = (double)(Math.round(answer1*100))/100;
TextView answer = (TextView) findViewById(R.id.pv_answer);
answer.setText("The number of years is: "+answer1);
}
else if(n.getText().toString().equals("")){
Toast errormsg = Toast.makeText(PresentValue.this, "Sorry but Number of Periods cannot be computed.", 5000);
errormsg.setGravity(Gravity.CENTER, 0, 0);
errormsg.show();
}
else {
Toast errormsg = Toast.makeText(PresentValue.this, "You either left too many fields empty or filled all of them.", 5000);
errormsg.setGravity(Gravity.CENTER, 0, 0);
errormsg.show();
}
}
});
Any idea on what's wrong with this?
Upvotes: 0
Views: 2322
Reputation: 4050
This is how I solved it. However it seems really ... stuffy. is there a way to make it more seemless?
//clickhandler
calc.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
EditText fv = (EditText) findViewById(R.id.pv_fv);
EditText pv = (EditText) findViewById(R.id.pv_pv);
EditText r = (EditText) findViewById(R.id.pv_discountrate);
EditText n = (EditText) findViewById(R.id.pv_periods);
EditText t = (EditText) findViewById(R.id.pv_years);
TextView answer = (TextView) findViewById(R.id.pv_answer);
int filledfields = 0;
if (fv.getText().toString().equals("")){
filledfields ++;
}
if (pv.getText().toString().equals("")) {
filledfields ++;
}
if (r.getText().toString().equals("")) {
filledfields ++;
}
if (t.getText().toString().equals("")) {
filledfields ++;
}
if (n.getText().toString().equals("")) {
filledfields ++;
}
if (filledfields > 1){
Toast errormsg = Toast.makeText(PresentValue.this, "Sorry but you left more than one field empty.", 5000);
errormsg.setGravity(Gravity.CENTER, 0, 0);
errormsg.show();
}
else if (fv.getText().toString().equals("")) {
double r1 = Double.parseDouble(r.getText().toString());
double n1 = Double.parseDouble(n.getText().toString());
double t1 = Double.parseDouble(t.getText().toString());
double pv1 = Double.parseDouble(pv.getText().toString());
double answer1 = pv1*(Math.pow(1+(r1/n1) ,n1*t1 ));
answer1 = (double)(Math.round(answer1*100))/100;
answer.setText("The Future Value of the cash flow is: "+answer1);
}
else if (pv.getText().toString().equals("")) {
double fv1 = Double.parseDouble(fv.getText().toString());
double r1 = Double.parseDouble(r.getText().toString());
double n1 = Double.parseDouble(n.getText().toString());
double t1 = Double.parseDouble(t.getText().toString());
double answer1 = fv1/(Math.pow(1+(r1/n1) ,n1*t1 ));
answer1 = (double)(Math.round(answer1*100))/100;
answer.setText("The Present Value of the cash flow is: "+answer1);
}
else if (r.getText().toString().equals("")){
double fv1 = Double.parseDouble(fv.getText().toString());
double pv1 = Double.parseDouble(pv.getText().toString());
double n1 = Double.parseDouble(n.getText().toString());
double t1 = Double.parseDouble(t.getText().toString());
double answer1 = ( (Math.pow(fv1/pv1, 1/(n1*t1) ) ) -1)*n1 ;
answer1 = (double)(Math.round(answer1*100))/100;
answer.setText("The discount rate / interest rate applied is: "+answer1);
}
else if (t.getText().toString().equals("")){
double fv1 = Double.parseDouble(fv.getText().toString());
double pv1 = Double.parseDouble(pv.getText().toString());
double n1 = Double.parseDouble(n.getText().toString());
double r1 = Double.parseDouble(r.getText().toString());
double answer1 = Math.log(fv1/pv1) / (n1* Math.log(1+(r1/n1) ) ) ;
answer1 = (double)(Math.round(answer1*100))/100;
answer.setText("The number of years is: "+answer1);
}
else if(n.getText().toString().equals("")){
Toast errormsg = Toast.makeText(PresentValue.this, "Sorry but Number of Periods cannot be computed.", 5000);
errormsg.setGravity(Gravity.CENTER, 0, 0);
errormsg.show();
}
else {
Toast errormsg = Toast.makeText(PresentValue.this, "You either left too many fields empty or filled all of them.", 5000);
errormsg.setGravity(Gravity.CENTER, 0, 0);
errormsg.show();
}
}
});
//clickhandler end
Upvotes: 0
Reputation: 94078
Put the names or the references to the fields into a List
or Set
. You can then easily retrieve the empty one you need afterwards.
And
if (emptyFieldSet.size() > 1) {
toast that says "error multiples are empty"
}
is a lot more readable than that last else
statement after oodles of if
s.
Upvotes: 0
Reputation: 178521
Assuming you have only these five fields - the else
statement is reachable only if none of the fields are empty.
If only one is empty, it will be caught by the relevant if statement - it works fine in this aspect.
If two ore more are empty - it will be caught only once, in the first if condition that applies - which seems not to be what you want.
If none are empty - the else
statement will be reached, though none are empty - this is obviously what you meant for.
An alternative approach could be not using the else if
statements, but only if
s, and count the number of faults. If it is higher then 1 - multiple fields are empty. If it is 0 - no fields are empty. If it can be applied is of course dependent on the actual content of the blocks for each statement.
Upvotes: 1