如何将 DecimalFilter 设置为允许输入负小数的 EditText? (Xamarin.Android)

How to set DecimalFilter to EditText which allows the input of negative decimals? (Xamarin.Android)

我有以下 DecimalFilter class:

public class DecimalFilter : Java.Lang.Object, IInputFilter
{
    String regex = "[-+]?[0-9]+((\.[0-9]{0," + (2 - 1) + "})?)||(\.)?";
    public DecimalFilter(int digitsAfterZero)
    {
        regex = "[-+]?^[0-9]+(.[0-9]{0," + (digitsAfterZero - 1) + "})?$";
    }

    public Java.Lang.ICharSequence FilterFormatted(Java.Lang.ICharSequence source, int start, int end, ISpanned dest, int dstart, int dend)
    {

        if (System.Text.RegularExpressions.Regex.IsMatch(dest.ToString(), regex) || dest.ToString().Equals(""))
        {
            return new Java.Lang.String(source.ToString());
        }

        return new Java.Lang.String(string.Empty);
    }
}

我将它设置为我的 EditText 是这样的:

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

我还设置了我的 EditText 以允许在我的 .axml 文件中使用负小数:

<EditText
        .....
        android:inputType="numberDecimal|numberSigned"
        android:id="@+id/discountEditText" />

当我输入 EditText 正数时,一切正常文件,但是当我开始输入 - 时,EditText 不允许我输入任何其他内容。它只保留 - 。如何使其能够接收小数分隔符后最多 2 个符号的负小数?我也为另一个 EditText 设置了相同的过滤器:

quantityEditText.SetFilters(new IInputFilter[] { new DecimalFilter(3) });

我希望 EditText 不能为负数。

but when I start typing in - EditText doesn't allow me to enter nothing else.

原因是当你在-后面输入另一个数字时,你的FilterFormatted中的dest的值只有“-”。在正则表达式中,您使用的是 [0-9]+。这意味着它至少需要一个数字。所以它 returns 在 IsMatch 中是错误的。
输入-时,dest的值为空。所以 if 条件为真。

对于这个问题,你可以尝试在匹配字符串的时候加上source。例如:

public class DecimalFilter : Java.Lang.Object, IInputFilter
{        
    public DecimalFilter(int digitsAfterZero)
    {
       String regex = "^[-+]?[0-9]+(.[0-9]{0," + (digitsAfterZero - 1) + "})?$";            
    }

    public Java.Lang.ICharSequence FilterFormatted(Java.Lang.ICharSequence source, int start, int end, ISpanned dest, int dstart, int dend)
    {
        if (System.Text.RegularExpressions.Regex.IsMatch(dest.ToString()+source, regex) || (dest.ToString()).Equals(""))
        {
            return new Java.Lang.String(source.ToString());
        }
        return new Java.Lang.String(string.Empty);
    }
}

I want that EditText not to be able to be negative.

我认为你需要使用新的过滤器。
例如:

public class DecimalFilter2 : Java.Lang.Object, IInputFilter
{        
    public DecimalFilter2(int digitsAfterZero)
    {           
       String regex = "^[^-][0-9]*(.[0-9]{0," + (digitsAfterZero - 1) + "})?$";
    }

    public Java.Lang.ICharSequence FilterFormatted(Java.Lang.ICharSequence source, int start, int end, ISpanned dest, int dstart, int dend)
    {           
        if (System.Text.RegularExpressions.Regex.IsMatch(dest.ToString()+ source, regex) || (dest.ToString() + source).Equals(""))
        {
            return new Java.Lang.String(source.ToString());
        }
        return new Java.Lang.String(string.Empty);
    }
}