计算器安卓中的小数点



我正在用安卓创建一个计算器应用程序。问题是我如何检查单个数值中是否存在两个小数.目前,我的计算器允许输入诸如1.2.3之类的输入,这是非法的。如果使用了运算符,则必须允许使用小数。例如1.1+2.2是合法的1.1.1+2.2但不是。这是我用于十进制处理的代码:

public class TrialCalculator extends AppCompatActivity implements Button.OnClickListener {
    Button btn1, btn2, btnBack, btn3, btn4, btn5, btn6, btn7, btn8, btn9, btn0, btnPlus, btnMinus, btnMul, btnDiv, btnEquals, btnClear, btnDecimal, btnPercent;
    EditText calcResult;
    double number = 0;
    private char opcode = '1';
    private void handleDecimal() {
        if (opcode == 0) clear();
        if (calcResult.getText() == null) {
            calcResult.setText("0.");
            calcResult.setSelection(2);
        } else {
            String txt = calcResult.getText().toString();
            if (txt.lastIndexOf(".")<txt.length()-1) {
                calcResult.append(".");
            }
        }
    }
}

我从onClick方法调用buttonDot

一种解决方案是有一个跟踪小数的标志:

class MyCalculator {
    private hasDecimal = false;
    // ...
}

将此标志设置为true用户首次键入小数。然后检查标志以查看以前是否键入了小数。

当然,这仅在您直接响应每次按键而不是在用户键入整个数字后从EditText获取整个输入时才有效。

您可以将

正则表达式与matches函数一起使用

\d*均匹配零位或多位数字

(\.\d+)?匹配一个.后跟一个或多个数字,?给定组的零次或一次之间的平均匹配

正则表达式演示:注意在java中使用matches函数,我们不需要^开始和$结束锚点

法典

if (txt.matches("\d*(\.\d+)?")) {
   // number has one decimal
  }
else{
   // number has more than one decimal
}
<小时 />

注意:如果您不想允许像 .5 这样的值,请使用 \d+ 而不是 \d* as

\d+(\.\d+)?

正如@Code学徒所建议的那样,如果你想接受像4343.这样的价值观您可以使用

\d*(\.\d*)?

使用文本观察程序

calcResult.addTextChangedListener(new TextWatcher() {
    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) {}
    @Override
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {}
    @Override
    public void afterTextChanged(Editable s) {
        boolean flag = s.toString().matches("\d*(\.\d*)?");
        if(!flag){
            // calcResult.setError...
            // you display a toast 
        }             
    }
});
<小时 />

更新:要将多个值与运算符匹配,可以使用

(\d*(\.\d*)?([+\-*%\]|$))*

正则表达式演示

测试用例

String pat="(\d*(\.\d*)?([+\-*%\]|$))*";
System.out.println("4.5-3.3+3.4".matches(pat));
System.out.println(".5".matches(pat));
System.out.println("4".matches(pat));
System.out.println("4.5.5-4.4".matches(pat));
System.out.println("4.44.5+4.4.4".matches(pat));
System.out.println("4.".matches(pat));

输出:

true
true
true
false
false
true

如果在字符串中找不到该字符,则lastIndexOf返回 -1。所以你的状况txt.lastIndexOf(".")<txt.length()-1总是true。您可以将其更改为

txt.lastIndexOf(".") == -1

要检查单个 no 中是否存在两个小数,然后按小数分隔字符串。

例如,

String txt = calcResult.getText().toString();
String[] decimals = txt.split("\.");
if(decimals.length > 2) {
// txt contains more than 1 decimal.
// Your logic ..
}

最新更新