我有一个editText
,用户可以输入金额。因此,我希望这个editText
不允许用户输入超过两位小数。
例如:23.45(不能是23.4567)
如何最好地实现这样的功能?
我有一个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:
请将以下扩展函数放置在项目中任何 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
}
})
附注:我需要TextWatcher用于其他工作,所以我没有将TextWatcher放在自定义函数中。这在我的项目中运行得很好。
谢谢:)
Kotlin使用EditText扩展的解决方案:
创建以下EditText小数限制器函数,其中包含一个TextWatcher,该函数将查找文本更改,例如检查小数位数和如果用户仅输入'.'符号,则将其前缀为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
额外步骤:
同时在您的布局文件中将inputType设置为numberDecimal
,这将仅显示数字键盘。
<EditText
android:inputType="numberDecimal" />
或者
您可以通过以下方式以程序方式设置 inputType:
decimalText.inputType = InputType.TYPE_CLASS_NUMBER
我从这篇文章中获得了帮助。
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) {
}
});
Kotlin解决方案与InputFilter
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))
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) {
}
});