如何为Xamarin.Android的EditText设置支持负小数输入的DecimalFilter?
解决Xamarin.Android中EditText支持负小数的DecimalFilter实现
看你当前的DecimalFilter代码,正则表达式的写法和过滤逻辑存在一些问题,导致负小数的输入支持不完整。下面是修正后的完整实现,能完美处理负小数、正数及各种合法小数格式:
完整的DecimalFilter类代码
public class DecimalFilter : Java.Lang.Object, IInputFilter { private readonly string _validPattern; // 构造函数:传入小数点后允许的最大位数 public DecimalFilter(int digitsAfterZero) { // 正则规则说明: // ^-? :允许开头有一个可选的负号 // \d+ :至少包含一个整数位 // (\.\d{0, digitsAfterZero})? :小数点后可以有0到指定位数的数字,整体为可选项 // |^\.?\d{0, digitsAfterZero} :兼容开头直接是小数点的情况(比如.12、.5) _validPattern = $"^-?\\d+(\\.\\d{{0,{digitsAfterZero}}})?$|^\\.?\\d{{0,{digitsAfterZero}}}$"; } public Java.Lang.ICharSequence FilterFormatted(Java.Lang.ICharSequence source, int start, int end, ISpanned dest, int dstart, int dend) { // 计算输入后的完整字符串,避免只判断原字符串导致的逻辑漏洞 string newInput = dest.ToString().Remove(dstart, dend - dstart).Insert(dstart, source.ToString()); // 匹配正则则允许输入,否则返回空字符串阻止非法输入 return System.Text.RegularExpressions.Regex.IsMatch(newInput, _validPattern) ? source : new Java.Lang.String(string.Empty); } }
关键改进点
- 正则表达式优化:修正了原正则中
^位置错误的问题,添加了负号支持,同时兼容多种合法输入场景(比如-.45、-123.4这类格式) - 过滤逻辑完善:不再仅判断原输入框内容,而是计算输入后的完整字符串是否合法,避免部分输入导致的判断失误
- 代码可读性提升:拆分了正则规则的注释,让逻辑更清晰
使用示例
在你的EditText中设置这个过滤器,比如允许小数点后保留2位:
var decimalFilter = new DecimalFilter(2); yourEditText.SetFilters(new IInputFilter[] { decimalFilter });
测试验证
可以测试以下场景是否正常工作:
- 合法输入:
123、123.4、123.45、.45、-123、-123.4、-.45 - 非法输入:
123.456(超过小数位数)、--123(多个负号)、12a3(含字母)都会被自动阻止
内容的提问来源于stack exchange,提问作者ProfileForStack4
相关产品推荐
相关产品推荐

