如何在 C#(MonoDroid) 中将 EditText 长度限制为 6 个整数和 3 个小数位?

How to limit EditText length to 6 integers and 3 decimal places in C#(MonoDroid)?

你好,我是新来的,不要那么辛苦,我正在Xamarin.Andriod中使用c#创建一个项目。

我正在尝试在 Xamarin.Android (C# / MonoDroid) 中验证 EditText。

我必须满足的条件如下: 'It allows entering 6 integers and 3 decimal places, in a range from 0 to 999999.999'

我在java中找到了一些可能的解决方案(我了解的不多,也没能用C#实现),如下:

TextWatcher with Java

InputFilter with Java

我不知道如何在 C# 中应用它,如果有人可以解释或给我一个简单的例子但在 C# 中。

这是我的 EditText:

                    ```<EditText
                        android:id="@+id/etVolume"
                        android:layout_width="@dimen/value_zero"
                        android:hint="Volumen"
                        android:textColor="@color/grisPrimario"
                        android:layout_height="fill_parent"
                        android:layout_weight="5"
                        android:textSize="@dimen/fluidListItem_text_size"
                        android:inputType="numberDecimal"
                        android:maxLength ="9"
                        android:textColorHint="@android:color/darker_gray"
                        android:backgroundTint="@color/grisPrimario"
                        android:gravity="bottom"
                        android:layout_marginBottom="-3dp"
                        android:layout_marginRight="@dimen/fluidListItemMarginRight"/>```

我的片段是这样定义这个 EditText 的:

Volume = itemAdministeredFluid.FindViewById<EditText>(Resource.Id.etVolume);

etVolume.setFilters(new Android.Text.IInputFilter[] {new DecimalDigitsInputFilter(6,3)});

但我不明白如何实现该方法。

我看到 java 他们使用 "TextWatcher" 和 "InputFilter" 但我不明白如何将其更改为 C#

非常感谢我在这方面花了几天的时间提供的帮助。

非常感谢您的帮助。

最好在代码中做到这一点,添加一个函数来检查 TextWatcher 内部。因为每当用户键入内容时都会调用它。

在该函数中,您可以检查条件并在条件不满足时显示错误消息。

editText.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {

    // call checkNumber() function here

}

@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {

    // TODO Auto-generated method stub
}

@Override
public void afterTextChanged(Editable s) {

    // TODO Auto-generated method stub
}
});

在 C# 中

public class TextWatcher : Java.Lang.Object, ITextWatcher
{
public void AfterTextChanged(IEditable s)
{
    //
}

public void BeforeTextChanged(ICharSequence s, int start, int count, int after)
{
    //
}

public void OnTextChanged(ICharSequence s, int start, int before, int count)
{
    //
}

}

将侦听器添加到您的 EditText

editText.AddTextChangedListener(new TextWatcher());

It allows entering 6 integers and 3 decimal places, in a range from 0 to 999999.999'

我创建了 IInputFilter,你可以看看:

 public class DecimalDigitsInputFilter : Java.Lang.Object, IInputFilter
{
    private double _min = 0;
    private double _max = 0;

    public DecimalDigitsInputFilter(double min, double max)
    {
        _min = min;
        _max = max;
    }

    public ICharSequence FilterFormatted(ICharSequence source, int start, int end, ISpanned dest, int dstart, int dend)
    {
        try
        {
            string val = dest.ToString().Insert(dstart, source.ToString());
            if (val.Contains("."))
            {
                string[] array = val.Split(".");
                string value1 = array[0].ToString();
                string value2 = array[1].ToString();

                if (value1.Length > 6|| value1=="")
                {                      
                }
                else
                {
                    if(value2!="" && value2.Length<=3)
                    {
                        double input = double.Parse(val);
                        if (IsInRange(_min, _max, input))
                            return null;

                    }
                    else if(value2=="")
                    {
                        if(IsInRange(_min,_max,double.Parse(value1)))
                        {
                            return null;
                        }
                    }                      
                }
            }
            else
            {
               if(val.Length<=6)
                {
                    double input = double.Parse(val);
                    if (IsInRange(_min, _max, input))
                        return null;
                }                                   
            }                 

        }
        catch (System.Exception ex)
        {
            Console.WriteLine("FilterFormatted Error: " + ex.Message);
        }

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


    }
    private bool IsInRange(double min, double max, double input)
    {
        return max > min ? input >= min && input <= max : input >= max && input <= min;
    }
}

 edittext1 = FindViewById<EditText>(Resource.Id.editText1);
 edittext1.SetFilters(new Android.Text.IInputFilter[] {new DecimalDigitsInputFilter(0,999999.999) });

使用InputFilter解决如下:

在片段中:

public EditText Volume;
Volume = itemAdministeredFluid.FindViewById<EditText>(Resource.Id.etVolume);
Volume.SetFilters(new IInputFilter[] { new DecimalDigitsInputFilter(6, 3) });
public class DecimalDigitsInputFilter : Java.Lang.Object, IInputFilter
    {
        string regexStr = string.Empty;

        public DecimalDigitsInputFilter(int digitsBeforeZero, int digitsAfterZero)
        {
            regexStr = "^[0-9]{0," + (digitsBeforeZero) + "}([.][0-9]{0," + (digitsAfterZero - 1) + "})?$";
        }

        public Java.Lang.ICharSequence FilterFormatted(Java.Lang.ICharSequence source, int start, int end, ISpanned dest, int dstart, int dend)
        {
            Regex regex = new Regex(regexStr);

            if (regex.IsMatch(dest.ToString()) || dest.ToString().Equals(""))
            {
                if (dest.ToString().Length < 6 && source.ToString() != ".")
                {
                    return new Java.Lang.String(source.ToString());
                }
                else if (source.ToString() == ".")
                {
                    return new Java.Lang.String(source.ToString());
                }
                else if (dest.ToString().Length >= 7 && dest.ToString().Length <= 10)
                {
                    return new Java.Lang.String(source.ToString());
                }
                else
                {
                    return new Java.Lang.String(string.Empty);

                }
            }

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

AXML

                        <EditText
                            android:id="@+id/etVolume"
                            android:layout_width="@dimen/value_zero"
                            android:hint="Volumen"
                            android:textColor="@color/grisPrimario"
                            android:layout_height="fill_parent"
                            android:layout_weight="5"
                            android:textSize="@dimen/fluidListItem_text_size"
                            android:inputType="numberDecimal"
                            android:maxLength ="10"
                            android:textColorHint="@android:color/darker_gray"
                            android:backgroundTint="@color/grisPrimario"
                            android:gravity="bottom"
                            android:layout_marginBottom="-3dp"
                            android:layout_marginRight="@dimen/fluidListItemMarginRight"/>

可以通过更好地修改和构建 ReGex 来改进此响应并删除过滤器。

它完全有效。输入小数点后6位后不允许输入更多的值,条件只允许输入点(.),然后输入小数点后3位。

我认为如果您创建一个更好的 RegEx,它会更干净。

修改我有一个条件,即要更改整数,必须删除整个值。

如果你有一个更清晰的答案,我希望看到它来实现它。