Android Edittext两个小数点



我有一个editText,用户可以在其中输入金额。因此,我希望此editText不允许用户输入两个以上的小数点。

示例: 23.45(不是23.4567(

实施这样的最佳方法是什么?

您应该使用InputFilter这是一个示例

public class DecimalDigitsInputFilter implements InputFilter {
Pattern mPattern;
public DecimalDigitsInputFilter(int digitsBeforeZero,int digitsAfterZero) {
    mPattern=Pattern.compile("[0-9]{0," + (digitsBeforeZero-1) + "}+((\.[0-9]{0," + (digitsAfterZero-1) + "})?)||(\.)?");
}
@Override
public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
        Matcher matcher=mPattern.matcher(dest);       
        if(!matcher.matches())
            return "";
        return null;
    }
}

您可以像这样使用

editText.setFilters(new InputFilter[] {new DecimalDigitsInputFilter(5,2)});

kotlin解决方案使用EditText的扩展:

创建以下EditText十进制限制器函数,其中包含 TextWatcher ,该功能将寻找文本更改,例如检查十进制数字的数量&amp&如果用户仅输入'。'符号,则它将以0。

前缀为前缀。
fun EditText.addDecimalLimiter(maxLimit: Int = 2) {
    this.addTextChangedListener(object : TextWatcher {
        override fun afterTextChanged(s: Editable?) {
            val str = this@addDecimalLimiter.text!!.toString()
            if (str.isEmpty()) return
            val str2 = decimalLimiter(str, maxLimit)
            if (str2 != str) {
                this@addDecimalLimiter.setText(str2)
                val pos = this@addDecimalLimiter.text!!.length
                this@addDecimalLimiter.setSelection(pos)
            }
        }
        override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {
        }
        override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
        }
    })
}
fun EditText.decimalLimiter(string: String, MAX_DECIMAL: Int): String {
    var str = string
    if (str[0] == '.') str = "0$str"
    val max = str.length
    var rFinal = ""
    var after = false
    var i = 0
    var up = 0
    var decimal = 0
    var t: Char
    val decimalCount = str.count{ ".".contains(it) }
    if (decimalCount > 1)
        return str.dropLast(1)
    while (i < max) {
        t = str[i]
        if (t != '.' && !after) {
            up++
        } else if (t == '.') {
            after = true
        } else {
            decimal++
            if (decimal > MAX_DECIMAL)
                return rFinal
        }
        rFinal += t
        i++
    }
    return rFinal
}

您可以使用如下:

val decimalText: EditText = findViewById(R.id.your_edit_text_id)
decimalText.addDecimalLimiter() // This will by default set the editText with 2 digit decimal
decimalText.addDecimalLimiter(3) // 3 or any number of decimals based on your requirements


其他步骤:

还将布局文件中的 numberDecimal设置为 inputType ,它将仅显示数字键键

<EditText
android:inputType="numberDecimal" />

您可以按以下方式进行编程设置InputType:

decimalText.inputType = InputType.TYPE_CLASS_NUMBER

我从这篇文章中获得了帮助。

kotlin:

在项目中不在课堂中的任何Kotlin文件内部的扩展功能都保持在下面。(可以在全球范围内访问班级或单独的文件之外(

fun String.removeAfter2Decimal(et: EditText) {
return if (this.isNullOrEmpty() || this.isNullOrBlank() || this.toLowerCase() == "null") {
    //
} else {
    if(this.contains(".")) {
        var lastPartOfText = this.split(".")[this.split(".").size-1]
        if (lastPartOfText.count() > 2) {
            try {
                lastPartOfText = this.substring(0, this.indexOf(".")+3)
                et.setText(lastPartOfText)
                et.setSelection(lastPartOfText.length)
            } catch (e: Exception) {
                e.printStackTrace()
            }
        } else {
        }
    } else {
    }
  }
}

现在使用如下:

myEditText.addTextChangedListener(object : TextWatcher {
        override fun afterTextChanged(editable: Editable?) {
        }
        override fun beforeTextChanged(cs: CharSequence?, p1: Int, p2: Int, p3: Int) {
        }
        override fun onTextChanged(cs: CharSequence?, p1: Int, p2: Int, p3: Int) {
            
            val mText = binding.etAmount.text.toString()
            mText.removeAfter2Decimal(binding.etAmount) // This will help to remove after 2 decimal text
        }
    })

p.s:我需要其他作品的文本观看者,因此我没有将TextWatcher放置在自定义功能中。这在我的项目中效果很好。

谢谢:(

您可以使用以下代码:

或。查看:http://v4all123.blogspot.in/2013/05/set-limit-for-fraction-in-decimal.html

    et = (EditText) vw.findViewById(R.id.tx_edittext);
    et.setFilters(new InputFilter[] {
            new DigitsKeyListener(Boolean.FALSE, Boolean.TRUE) {
                int beforeDecimal = 5, afterDecimal = 2;
                @Override
                public CharSequence filter(CharSequence source, int start, int end,
                        Spanned dest, int dstart, int dend) {
                    String temp = et.getText() + source.toString();
                    if (temp.equals(".")) {
                        return "0.";
                    }
                    else if (temp.toString().indexOf(".") == -1) {
                        // no decimal point placed yet
                        if (temp.length() > beforeDecimal) {
                            return "";
                        }
                    } else {
                        temp = temp.substring(temp.indexOf(".") + 1);
                        if (temp.length() > afterDecimal) {
                            return "";
                        }
                    }
                    return super.filter(source, start, end, dest, dstart, dend);
                }
            }
    });

或,

et.addTextChangedListener(new TextWatcher() {
public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {
    String text = arg0.toString();
    if (text.contains(".") && text.substring(text.indexOf(".") + 1).length() > 2) {
        et.setText(text.substring(0, text.length() - 1));
        et.setSelection(et.getText().length());
    }
}
public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {
}
public void afterTextChanged(Editable arg0) {
}
});
           input.addTextChangedListener(new TextWatcher() {
                public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {
                    String text = arg0.toString();
                    if (arg0.length() <= 1) {
                        if (text.contains(".") && text.indexOf(".") == 0) {
                            holder.input.setText("0.");
                            holder.input.setSelection(holder.input.getText().length());
                        }
                    } else {
                        if (text.contains(".") &&
                                text.indexOf(".") != text.length() - 1 &&
                                String.valueOf(text.charAt(text.length() - 1)).equals(".")) {
                            holder.input.setText(text.substring(0, text.length() - 1));
                            holder.input.setSelection(holder.input.getText().length());
                        }
                        if (text.contains(".") && text.substring(text.indexOf(".") + 1).length() > 2) {
                            holder.input.setText(text.substring(0, text.length() - 1));
                            holder.input.setSelection(holder.input.getText().length());
                        }
                    }
                }
                public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {
                }
                public void afterTextChanged(Editable arg0) {
                }
            });

kotlin解决方案

class DecimalDigitsInputFilter(digitsBeforeZero: Int, digitsAfterZero: Int) : InputFilter {
    //                                             digitsBeforeZero  or       digitsBeforeZero + dot + digitsAfterZero
    private val pattern = Pattern.compile("(\d{0,$digitsBeforeZero})|(\d{0,$digitsBeforeZero}\.\d{0,$digitsAfterZero})")
    override fun filter(source: CharSequence, start: Int, end: Int, dest: Spanned, dstart: Int, dend: Int): CharSequence? {
        return if (source.isEmpty()) {
            // When the source text is empty, we need to remove characters and check the result
            if (pattern.matcher(dest.removeRange(dstart, dend)).matches()) {
                // No changes to source
                null
            } else {
                // Don't delete characters, return the old subsequence
                dest.subSequence(dstart, dend)
            }
        } else {
            // Check the result
            if (pattern.matcher(dest.replaceRange(dstart, dend, source)).matches()) {
                // No changes to source
                null
            } else {
                // Return nothing
                ""
            }
        }
    }
}

您可以这样使用:

editText.filters = arrayOf(DecimalDigitsInputFilter(5, 2))

最新更新