Java 对EditText中的数据执行数值计算时出错
我刚接触安卓系统,遇到了一个令人困惑的问题。我试图对在一个或多个EditText字段中输入的某些文本执行一些数值计算(每个字段都有相应的算法来确定结果),然后将结果/结果存储在与EditText关联的一些文本视图中。EditText1与TextView1关联;EditText2与TextView2关联。在我的程序中,将有十个EditText,每个EditText都有一个关联的TextView。所有或没有EditText中可能包含一些数字数据。按下按钮(使用andriod:onClick=“buttonPressed”)后将进行计算,此时,任何具有数字输入的EditText都应将其数据拉出并进行计算(使用特定于该数据段的公式),结果存储在EditText的特定文本视图中 当我只使用一个EditText和一个TextView时,一切都很好。EditText中的数据被正确解析、计算,结果存储在TextView中。下面是这种情况下的代码:Java 对EditText中的数据执行数值计算时出错,java,android,Java,Android,我刚接触安卓系统,遇到了一个令人困惑的问题。我试图对在一个或多个EditText字段中输入的某些文本执行一些数值计算(每个字段都有相应的算法来确定结果),然后将结果/结果存储在与EditText关联的一些文本视图中。EditText1与TextView1关联;EditText2与TextView2关联。在我的程序中,将有十个EditText,每个EditText都有一个关联的TextView。所有或没有EditText中可能包含一些数字数据。按下按钮(使用andriod:onClick=“but
public void buttonPressed(View view)
{
if (editText1.getText() != null)
textView1.setText(Double.toString(Double.valueOf(editText1.getText().toString())/12));
}
但是,如果我尝试扩展此代码并使用另一个EditText和TextView,如下所示:
public void buttonPressed(View view)
{
if (editText1.getText() != null)
textView1.setText(Double.toString(Double.valueOf(editText1.getText().toString())/12));
if (editText2.getText() != null)
textView2.setText(Double.toString(Double.valueOf(editText2.getText().toString())/107));
}
我发现一些错误,似乎表明存在解析问题。以下是LogCat输出(我不擅长解释):
我不明白为什么我用来对EditText中的数据执行计算的解析方法(我不确定如何执行此操作,但我通过多次尝试和错误发现这种方法)只适用于一个字段,而不适用于两个字段。在过去的几个小时里,我尝试了很多其他的方法,但都没有找到答案
非常感谢您的帮助
编辑:我忘了说我所有的编辑文本都有android:numeric=“decimal”(我知道这是不推荐的,但我在这里使用它),这样我就不会有任何非数字的输入。您的一个字段包含空字符串,而不是null。你需要像这样扩展条件
if (editText1.getText() != null)
更像
if (editText1.getText() != null && !editText1.getText().toString().equals(""))
捕获空字符串大小写。还有两种较短的书写方法。您可能希望了解Apache的StringUtils
类,该类具有名为isEmpty
和isBlank
的方法,这些方法可能对您有所帮助
您可能还想考虑,如果其他无效值进入其中一个字段,该怎么办。您只需要在转换过程中使用if子句,以确保字符串不是空的 尝试将空字符串转换为双精度字符串时失败 更改此行:
if(editText1.getText() != null){
致:
现在,如果用户在EditText中输入一个非数字,您仍然会遇到问题
在整个乱七八糟的地方放一个try/catch语句,以捕获许多格式的概念
我只是添加了这个语句,因为如果语句需要另一个字符版本,sof不允许使用一个字符版本!(不)而且您的方法不考虑空格。在检查字符串是否为空之前,应该修剪字符串。另外,Android内置了TextUtils来完成与StringUtils相同的工作。“空格”问题就是我提到的
isBlank
的原因。我永远不会用trim
来写所有这些-我总是使用StringUtils
方法之一。谢谢你关于TextUtils
的注释;我不知道Android有这个功能。谢谢!我希望我能接受这两个答案,因为他们都是正确的,我从他们身上学到了一些东西。然而,我的错误源于这样一个事实,即我错误地认为null和“”是同一件事(因此我没有测试“”),但从您的回答中,我了解到“”是空字符串,这是不同的。再次感谢所有帮助过我的人!你可以从这两个问题的答案中学到一些东西——发帖的人对空和空的区别感到困惑。这是关于堆栈溢出的一个非常常见的主题。您可以简单地捕获NFE,如果有,它将解释为空以及不正确的格式。我非常确信editText1.getText()永远不会返回null。getText返回可编辑的。如果只有数字是EditText的合法输入,我建议在EditText上设置android:inputType=“number”属性。
if(editText1.getText() != null){
if(editText1.getText() != null && !TextUtils.isEmpty(editText1.getText().toString().trim())){