【问题标题】:How to exclude any value in this calculation that is 0如何排除此计算中为 0 的任何值
【发布时间】:2017-02-16 15:58:43
【问题描述】:

我有一个计算,我必须从用户使用 EditText 给出的总数中减去 5 个变量,我的问题是:有没有办法排除任何值(et1、et2、et3、et4 , et5) 如果其中一个为 0? 例如,如果用户将 500 设为“totaal”,et1 和 et2 为零,其余四个我只希望从“totaal”中减去 3*4

这是代码:

        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)

【问题讨论】:

  • 问题是为了什么? x-0=x 所以 0 是 neutral element 用于加减法
  • 但是如果双精度为 0 应用程序崩溃
  • 你能展示一些代码来了解你哪里出错了吗?
  • 然后质疑崩溃
  • 我很确定 0 不是问题......我敢打赌它是在解析空字符串

标签: android mobile calculation


【解决方案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
}

您已经在为 ET1 执行此操作,但仅针对 ET1,您必须为所有人执行此操作,因为这些字段中的任何一个都可能为空。我希望这会有所帮助。

【讨论】:

  • 我会这样做double et1 = ET1.getText().toString()==string.Empty :0?Double.parseDouble(ET1.getText().toString()); 可能还想首先从字符串中正则表达式所有非数字字符,并将字符串存储为变量,然后再转换为双精度,以防止不得不去ET1 并解析这么多值。
  • 是的,可以做很多改进来以更好的方式实现这一点,但我只是决定让 OP 知道他应该做什么。
  • 这很公平,但我永远不想像这样在一个 if 中测试所有这些。
【解决方案2】:

这无关紧要,任何负零都是它本身,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 的数字或小数点 '.'或 ',',第二行获取第一行的结果并检查是否存在某些内容,然后尝试将其转换为小数。提醒一句,如果用户输入多个小数或仅输入一个小数而没有实际数字,这仍然会导致问题。它仍然可以改进,但它会解决您遇到的许多问题。

【讨论】:

    猜你喜欢
    • 2020-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-01
    • 2022-11-28
    • 1970-01-01
    • 2021-12-30
    • 2017-01-06
    相关资源
    最近更新 更多