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; } }
关键修改点说明
正则表达式重构:
- 用
^和$锚定整个字符串,避免出现“部分符合但整体非法”的情况 - 把
[0-9]+替换成[0-9]?,严格限制整数部分最多1位(保留?是为了支持用户先输入小数点的场景,比如.56;如果不需要这个场景,直接改成[0-9]即可) - 调整小数部分的匹配逻辑,直接使用传入的
digitsAfterZero参数,确保允许最多指定位数的小数
- 用
完整内容校验:
原来的代码只校验了当前输入框已有内容,现在改成校验输入后的完整字符串,能处理更多边界情况(比如已经输入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
相关产品推荐
相关产品推荐

