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

如何将DecimalFilter设置为允许输入负小数的EditText?(Xamarin.Android),filter,xamarin.android,set,negative-number,Filter,Xamarin.android,Set,Negative Number,我有以下DecimalFilter类: 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," +

我有以下
DecimalFilter
类:

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
设置为允许在我的
文件中使用负小数:

<EditText
        .....
        android:inputType="numberDecimal|numberSigned"
        android:id="@+id/discountEditText" />
我希望编辑文本不能是负面的

但是当我开始输入时,-EditText不允许我输入任何其他内容

原因是当您在
-
之后输入另一个数字时,
FilterFormatted
中的
dest
值仅为“-”。在正则表达式中,您使用的是
[0-9]+
。这意味着它至少需要一个号码。因此它在
IsMatch
中返回false
当您输入
-
时,
dest
的值为空。因此,if条件为true

对于此问题,您可以在匹配字符串时尝试添加
源代码。例如:

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);
    }
}
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);
    }
}
我希望编辑文本不能是负面的

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

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);
    }
}
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);
    }
}

对于第一个问题,我更改了正则表达式,但现在我甚至无法输入
-
,然后我将正则表达式设置为以前的样子,并更改了
过滤执行的
方法。它保持不变,我无法输入
-
。然后我更改了正则表达式和过滤执行的
方法,并且我也无法输入
-@ProfileForStack4,抱歉这个错误。第一个解决方案,在我这边行得通,我不知道为什么在你这边不行。对于第二个解决方案,请删除
if
条件中的第二个源。我已经修改并测试了我的答案,请检查一下。现在一切都好了。我只需要在我的
EditText的
.axml
文件中放入
android:inputType=“numberDecimal | numberSigned”
。谢谢