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

Xamarin.Android如何限制EditText小数点前1位后2位输入

解决Xamarin.Android EditText限制小数点前1位、后2位的问题

嘿,我来帮你调整这个DecimalFilter,让它同时满足你要的两种限制:小数点前最多1位数字(0-9),小数点后最多2位数字。

问题分析

你原来的正则表达式里,[0-9]+这部分会允许任意多个数字出现在小数点前,这就是没法限制整数部分位数的核心原因。我们需要把这部分改成只允许1位数字,同时保留对小数部分的限制,还要覆盖所有合法的输入场景。

修改后的DecimalFilter代码

class DecimalFilter : Java.Lang.Object, IInputFilter
{
    private string _regex;

    public DecimalFilter(int digitsAfterZero)
    {
        // 正则表达式规则拆解:
        // ^ 锚定字符串开头,$ 锚定结尾,确保整串都符合规则
        // [0-9]? 允许0或1位整数(支持先输入小数点的场景,比如.12;不需要的话可以去掉?变成[0-9])
        // (\\.[0-9]{0," + digitsAfterZero + "})? 允许0或1个小数点,后面跟0到指定位数的小数
        _regex = "^[0-9]?(\\.[0-9]{0," + digitsAfterZero + "})?$";
    }

    public Java.Lang.ICharSequence FilterFormatted(Java.Lang.ICharSequence source, int start, int end, ISpanned dest, int dstart, int dend)
    {
        // 拼接出输入后的完整字符串,确保校验的是最终结果而非当前已有内容
        string newText = dest.ToString().Remove(dstart, dend - dstart).Insert(dstart, source.ToString());
        
        // 不匹配规则就过滤掉输入的字符
        if (!System.Text.RegularExpressions.Regex.IsMatch(newText, _regex))
        {
            return new Java.Lang.String(string.Empty);
        }
        
        return null;
    }
}

关键修改点说明

  1. 正则表达式重构:

    • 用^和$锚定整个字符串,避免出现“部分符合但整体非法”的情况
    • 把[0-9]+替换成[0-9]?,严格限制整数部分最多1位(保留?是为了支持用户先输入小数点的场景,比如.56;如果不需要这个场景,直接改成[0-9]即可)
    • 调整小数部分的匹配逻辑,直接使用传入的digitsAfterZero参数,确保允许最多指定位数的小数
  2. 完整内容校验:
    原来的代码只校验了当前输入框已有内容,现在改成校验输入后的完整字符串,能处理更多边界情况(比如已经输入9,再输入0时会被正确过滤)

使用方式

和你原来的用法一致,把过滤器添加到EditText即可:

yourEditText.SetFilters(new IInputFilter[] { new DecimalFilter(2) });

设置完成后,EditText就只允许输入符合要求的内容了,比如1.56、3.68、9.9、2.1,而像10.1、9.999、12这类非法输入都会被自动过滤。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 16:27:30