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

如何为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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:33:54