计算器android中的小数点

时间:2017-01-15 07:57:10

标签: java android string-comparison

我在android中创建一个计算器应用程序。问题是如何在单个数值中检查是否存在两位小数。目前我的计算器允许输入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(".");
            }
        }
    }
}

我从buttonDot方法调用onClick

4 个答案:

答案 0 :(得分:1)

您可以将正则表达式与matches函数

一起使用

\\d*表示匹配零个或多个数字

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

Regex Demo:请注意java中的matches函数,我们不需要^ start和$结尾锚

代码

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

注意:如果您不想允许.5等值,请使用\\d+代替\\d*

\\d+(\\.\\d+)?

正如@ Code-Apprentice建议的那样,如果你想接受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*)?([+\\-*%\\]|$))*

RegEx demo

测试用例

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

答案 1 :(得分:1)

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

class MyCalculator {
    private hasDecimal = false;

    // ...
}

第一次用户输入小数时,将此标志设置为true。然后检查标志以查看先前是否输入过小数。

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

答案 2 :(得分:0)

如果在字符串中找不到该字符,则

lastIndexOf返回-1。因此,您的条件txt.lastIndexOf(".")<txt.length()-1始终为true。您可以将其更改为

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

答案 3 :(得分:0)

要检查单个no中是否存在两位小数,请将该字符串按十进制分割。

例如,

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