【问题标题】:How to validate decimal input not allowing alone "." and empty field?如何验证十进制输入不允许单独“。”和空场?
【发布时间】:2019-08-09 17:23:05
【问题描述】:

我正在 Android Studio 上用 Java 编写一个计算器,如果用户用点“。”调用结果,应用程序就会崩溃。单独或让 EditText 字段为空白。 我正在寻找一种解决方案,以防止这两种情况在三个领域的每一个中一起或单独发生。 我已经尝试过 TextWatcher 和 if/else 但没有成功。

设计editText字段的.xml文件已经设置为decimalNumber。

我已经试过了:

if(myfieldhere.getText().toString().equals(".")){myfieldhere.setText("0");}

如果一切正常,对于每个“勇气线”和“最终结果”线。两者都在 setOnClickListener 块内。这是我的代码:

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.peso_layout);
        result = findViewById(R.id.layresult);
        conc = findViewById(R.id.layconc);
        dose = findViewById(R.id.laydose);
        peso = findViewById(R.id.laypeso);
        calc = findViewById(R.id.laycalcpeso);

    calc.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
        float valor1 = Float.parseFloat(peso.getText().toString());
        float valor2 = Float.parseFloat(conc.getText().toString());
        float valor3 = Float.parseFloat(dose.getText().toString());
        float finalresult = valor1 * valor2 * valor3;
        result.setText("The result is: " + finalresult);
                }

    });
    }

理想的输出应该是应用程序在这两种情况发生时不会崩溃,并向用户发送输入无效的错误消息。 我收到的是应用程序崩溃。 非常感谢你。我是 Java 的初学者,我为此苦苦挣扎了几天。

【问题讨论】:

  • Float.parseFloat 抛出异常。您可以捕获它并显示带有错误消息的Toast,而不是计算结果。不过,这可能不是您想要的。
  • 为什么不直接获取浮动之前的文本并对其进行验证?例如,如果 !empty,如果 != "."。或相反并返回或其他。只是简单的验证......你似乎没有什么理由让它过于复杂。您也可以使用 try catch 并返回。
  • M. Prokhorov,我可以设置 Toast,但应用程序一直崩溃,因为它没有时间显示按摩。 CmosBattery,我尝试过相反的方法,但是 if 语句出现错误。谢谢你们的解决方案。

标签: java android validation android-studio escaping


【解决方案1】:

亲爱的朋友,您直接尝试将字符串输入转换为浮点数,然后在您的检查值之后执行您的代码,如下所示。

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

EditText edt1,edt2;
TextView txtans;
Button btnsum;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    edt1=findViewById(R.id.edt1);
    edt2=findViewById(R.id.edt2);
    txtans=findViewById(R.id.txtans);
    btnsum=findViewById(R.id.btnsum);
    btnsum.setOnClickListener(this);

}

@Override
public void onClick(View v) {
    if(v.getId()==R.id.btnsum){
        float n1,n2;
        String value1=edt1.getText().toString();
        String value2=edt2.getText().toString();

        if(value1.equals("") || value1.equals(".")){
            n1=0;
        }else {
            n1= Float.parseFloat(value1);
        }
        if(value2.equals("")|| value2.equals(".")){
            n2=0;
        }else{
            n2= Float.parseFloat(value2);
        }
        float ans=n1+n2;


        txtans.setText(ans+"");

    }
}

}

见在上面的代码中,F首先从edittext中获取值,然后检查它是否包含null或“。”在里面。如果它包含,则将 0.0 值存储在某个变量中。然后在求和后显示在文本框中。

【讨论】:

  • 这完全解决了问题。非常非常感谢!
【解决方案2】:
calc.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        String myvalor = myfieldhere.getText().toString();
        if(myvalor.equals(".") || myvalor.isEmpty())
        {
            // toast error : incorrect value
            return;
        }
        try
        {
            float valor1 = Float.parseFloat(peso.getText().toString());
            float valor2 = Float.parseFloat(conc.getText().toString());
            float valor3 = Float.parseFloat(dose.getText().toString());
            float finalresult = valor1 * valor2 * valor3;
            result.setText("The result is: " + finalresult);
        }
        catch(Exception exp){// toast with exp.toString() as message}
    }
});

【讨论】:

  • 出于某种原因,我在我的应用程序上遇到了布尔 OR 问题。问题已经解决了。非常感谢您的回答。
【解决方案3】:

使用 TextUtils 检查空字符串更好

if(TextUtils.isEmpty(peso.getText().toString())||
TextUtils.isEmpty(conc.getText().toString())||
TextUtils.isEmpty(dose.getText().toString())){
   return;
 }

【讨论】:

  • 由于某种原因,该应用程序不允许在一行中使用 OR 布尔组合。也许我需要明确设置它。问题解决了。非常感谢您的回答。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-11-15
  • 2011-08-31
  • 2017-04-25
  • 2022-11-29
  • 2012-01-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多