You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android Studio开发Java计算器:限制单个数字仅含一个小数点

解决计算器单数字仅允许一个小数点的问题

问题根源

你原代码的核心问题有两个:

  1. 正则表达式存在语法错误(\d未转义为\\d,字符类写法错误),导致合法输入也无法匹配,进而持续禁用等号按钮
  2. 未实现阻止重复输入小数点的前置拦截逻辑,仅靠事后验证体验不佳

完整解决方案

1. 修正输入验证正则

使用符合要求的正则表达式,确保每个数字段只能是整数或带单个小数点的小数,且支持合法运算表达式:

Pattern p = Pattern.compile("(\\d+(\\.\\d+)?([+\\-*%]|$))+");

正则说明:

  • \\d+(\\.\\d+)?:匹配整数(如123)或合法小数(如123.45),禁止单独的小数点(如.)或多小数点(如1.2.3)
  • ([+\\-*%]|$):每个数字段后必须跟运算符或输入结尾
  • 外层+:支持多段「数字+运算符」的合法表达式(如1.1+2.3)

2. 拦截重复小数点输入

在小数点按钮的点击事件中,直接判断当前输入的最后一个数字段是否已包含小数点,避免无效输入:

btnDot.setOnClickListener(v -> {
    String currentInput = edUserInput.getText().toString();
    // 定位最后一个运算符的位置,分割出当前正在输入的数字段
    int lastOperatorPos = Math.max(
        Math.max(currentInput.lastIndexOf('+'), currentInput.lastIndexOf('-')),
        Math.max(currentInput.lastIndexOf('*'), currentInput.lastIndexOf('%'))
    );
    String currentNumber = currentInput.substring(lastOperatorPos + 1);
    
    // 仅当当前数字段无小数点时,才添加小数点
    if (!currentNumber.contains(".")) {
        edUserInput.append(".");
    }
});

3. 完善输入验证逻辑

修复TextWatcher中的匹配逻辑,统一变量名(原代码中UserInput与edUserInput不一致),确保合法输入时启用等号按钮:

edUserInput.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) {
        String input = s.toString().trim();
        if (input.isEmpty()) {
            btnEqual.setEnabled(false);
            return;
        }
        Matcher m = p.matcher(input);
        if (m.matches()) {
            edUserInput.setError(null);
            btnEqual.setEnabled(true);
        } else {
            edUserInput.setError("输入格式非法");
            btnEqual.setEnabled(false);
        }
    }

    @Override
    public void afterTextChanged(Editable s) {}
});

最终效果

  • 禁止输入1.2.3、1.这类非法格式
  • 支持1+2.3、1.1*2.2这类合法运算表达式
  • 用户无法重复输入小数点,无需事后纠错
  • 合法输入时自动启用等号按钮,非法输入则禁用并提示错误

内容的提问来源于stack exchange,提问作者just coding

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 05:25:06