2017-02-16 10 views
-4

У меня есть вычисление, в котором я должен вычесть 5 переменных из общей суммы, которые все заданы пользователем с помощью EditText, snd, мой вопрос: есть ли способ исключить любое значение (et1, et2, et3, et4, et5), если один из них равен 0? , например, если пользователь помещает 500 как «Totaal» и Et1 & ET2 нуля и для остальных четырех я Oly хочу 3 * 4 вычитается из «Totaal»Как исключить любое значение в этом вычислении, которое равно 0

Это код:

 import android.support.v7.app.AppCompatActivity; 
    import android.os.Bundle; 
    import android.text.Editable; 
    import android.text.TextWatcher; 
    import android.view.View; 
    import android.widget.Button; 
    import android.widget.EditText; 
    import android.widget.TextView; 
    import java.text.DecimalFormat; 

public class Bereken extends AppCompatActivity { 
private Double totaal = null; 
TextView Txttotal; 
Button k1; 
Button k2; 
Button k3; 
TextView kies; 
EditText ET1; 
EditText ET2; 
EditText ET3; 
EditText ET4; 
EditText ET5; 
double temporary; 
double randomdouble; 
double formerval; 
double totje; 


@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_bereken); 
    totaal = getIntent().getExtras().getDouble("Hannibal"); 
    Txttotal = (TextView) findViewById(R.id.Tijdelijk); 
    Txttotal.setText(new DecimalFormat("##.##").format(totaal)); 
    k1 = (Button)findViewById(R.id.optie1); 
    k2 = (Button)findViewById(R.id.optie2); 
    k3 = (Button)findViewById(R.id.optie3); 
    ET1 = (EditText)findViewById(R.id.editText7); 
    ET2 = (EditText)findViewById(R.id.editText8); 
    ET3 = (EditText)findViewById(R.id.editText9); 
    ET4 = (EditText)findViewById(R.id.editText10); 
    ET5 = (EditText)findViewById(R.id.editText11); 

    ET1.addTextChangedListener(new TextWatcher() { 
     @Override 
     public void beforeTextChanged(CharSequence s, int start, int count, int after) { 


     } 

     @Override 
     public void onTextChanged(CharSequence s, int start, int before, int count) { 
     } 

     @Override 
     public void afterTextChanged(Editable s) { 
      if(!ET1.getText().toString().equals("")) { 
       double et1 = Double.parseDouble(ET1.getText().toString()); 
       double et2 = Double.parseDouble(ET2.getText().toString()); 
       double et3 = Double.parseDouble(ET3.getText().toString()); 
       double et4 = Double.parseDouble(ET4.getText().toString()); 
       double et5 = Double.parseDouble(ET5.getText().toString()); 
       totje = totaal - et1 - et2 - et3 - et4 - et5; 
       Txttotal.setText(new DecimalFormat("##.##").format(totje)); 
      }else{ 
       totaal = totaal + formerval; 
       Txttotal.setText(new DecimalFormat("##.##").format(totaal)); 
      } 
      randomdouble = temporary; 
     } 
    }); 

    ET2.addTextChangedListener(new TextWatcher() { 
     @Override 
     public void beforeTextChanged(CharSequence s, int start, int count, int after) { 

     } 

     @Override 
     public void onTextChanged(CharSequence s, int start, int before, int count) { 

     } 

     @Override 
     public void afterTextChanged(Editable s) { 

     } 
    }); 

    ET3.addTextChangedListener(new TextWatcher() { 
     @Override 
     public void beforeTextChanged(CharSequence s, int start, int count, int after) { 

     } 

     @Override 
     public void onTextChanged(CharSequence s, int start, int before, int count) { 

     } 

     @Override 
     public void afterTextChanged(Editable s) { 

     } 
    }); 

    ET4.addTextChangedListener(new TextWatcher() { 
     @Override 
     public void beforeTextChanged(CharSequence s, int start, int count, int after) { 

     } 

     @Override 
     public void onTextChanged(CharSequence s, int start, int before, int count) { 

     } 

     @Override 
     public void afterTextChanged(Editable s) { 

     } 
    }); 

    ET5.addTextChangedListener(new TextWatcher() { 
     @Override 
     public void beforeTextChanged(CharSequence s, int start, int count, int after) { 

     } 

     @Override 
     public void onTextChanged(CharSequence s, int start, int before, int count) { 

     } 

     @Override 
     public void afterTextChanged(Editable s) { 

     } 
    }); 

и это ошибка

02-16 17:05:11.148 18568-18568/dipp.verlinden E/AndroidRuntime: FATAL EXCEPTION: main 
Process: dipp.verlinden, PID: 18568 
java.lang.NumberFormatException: Invalid double: "" 
at java.lang.StringToReal.invalidReal(StringToReal.java:63) 
at java.lang.StringToReal.parseDouble(StringToReal.java:267) 
at java.lang.Double.parseDouble(Double.java:301) 
at dipp.verlinden.Bereken$1.afterTextChanged(Bereken.java:64) 
at android.widget.TextView.sendAfterTextChanged(TextView.java:9195) 
at android.widget.TextView$ChangeWatcher.afterTextChanged(TextView.java:11939) 
at android.text.SpannableStringBuilder.sendAfterTextChanged(SpannableStringBuilder.java:1047) 
at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:564) 
at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:494) 
at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:34) 
at android.view.inputmethod.BaseInputConnection.replaceText(BaseInputConnection.java:691) 
at android.view.inputmethod.BaseInputConnection.commitText(BaseInputConnection.java:199) 
at com.android.internal.widget.EditableInputConnection.commitText(EditableInputConnection.java:184) 
at com.android.internal.view.IInputConnectionWrapper.executeMessage(IInputConnectionWrapper.java:286) 
at com.android.internal.view.IInputConnectionWrapper$MyHandler.handleMessage(IInputConnectionWrapper.java:78) 
at android.os.Handler.dispatchMessage(Handler.java:102) 
at android.os.Looper.loop(Looper.java:158) 
at android.app.ActivityThread.main(ActivityThread.java:7229) 
at java.lang.reflect.Method.invoke(Native Method) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120) 
+3

вопрос для чего? 'x-0 = x', поэтому 0 является [нейтральным элементом] (https://en.wikipedia.org/wiki/Identity_element) для добавления и вычитания – Selvin

+0

Но если double равен 0, приложение вылетает –

+0

Можете ли вы показать код понять, где вы ошибаетесь? –

ответ

0

Это никогда не имеет значения, все, что минус ноль сама, totaal-et1 где et1=0totaal является. Просто позвольте этому делать математику и не переустанавливайте свой код, пытаясь сделать что-то, что не изменит результат.

Вы не будете экономить на обработке, поскольку базовая математика с использованием 0 быстрее, чем проверки, чтобы проверить, являются ли они 0 и переписать математику. Вы не будете экономить место, так как ваш код будет баллотироваться по размеру.

Теперь, когда вы включили остальную часть кода, ваша проблема имеет больше смысла.

string et1s =regex.replace(ET1.getText().toString(),"[^0-9.,]",""); 
double et1 = et1s ==string.Empty :0?Double.parseDouble(et1s); 

Первая строка берет ввод, удаляет все, что не является числом от 0 до 9 или десятичным. или ',', вторая строка берет результат первой строки и проверяет, что там что-то там пытается преобразовать ее в десятичную. Слово предупреждения, это все равно вызовет проблему, если пользователь вводит несколько десятичных знаков или просто десятичное число и не имеет действительного числа. Его все еще можно улучшить, но он решит многие из ваших проблем.

1

Проблема не в 0, но в этой части

double et1 = Double.parseDouble(ET1.getText().toString()); 
double et2 = Double.parseDouble(ET2.getText().toString()); 
double et3 = Double.parseDouble(ET3.getText().toString()); 
double et4 = Double.parseDouble(ET4.getText().toString()); 
double et5 = Double.parseDouble(ET5.getText().toString()); 

Здесь ошибка возникает, когда из ET2, ET3, ET4, ET5 пустая строка («») и не может быть разобрано к двойной.

Таким образом, вы должны проверить его с помощью условия, как это:

if(!ET1.getText().toString().equals("") && !ET2.getText().toString().equals("") && 
    !ET3.getText().toString().equals("") && !ET4.getText().toString().equals("") && 
    !ET5.getText().toString().equals("")) { 
//double parsing code here 
} else { 
//code to run if either of the fields are empty 
} 

Вы уже делали это для ЕТ1, но ET1 только, вы должны сделать это для всех, как любой из этих полей может быть пустым , Надеюсь, это поможет.

+0

Я бы сделал это 'double et1 = ET1. getText(). toString() == string.Empty: 0? Double.parseDouble (ET1.getText(). toString()); 'Возможно, также захочется повторно вывести все нецифровые символы из строки сначала и сохранить string как переменную перед преобразованием в double, чтобы не допустить перехода в ET1 и разобрать значение так сильно. – Andrew

+0

Да, многие улучшения могут быть достигнуты для достижения этого лучше, но я просто решил дать ОП основную идею того, что он должен делать. –

+0

Это справедливо, но я бы никогда не захотел проверить их все в одном «если». – Andrew