猿问

限制Android EditText中的小数位数

我正在尝试编写一个可帮助您管理财务的应用程序。我正在使用一个EditText字段,用户可以在其中指定金额。


我将设置inputType为numberDecimal可以正常使用,除了允许人们输入数字(例如,123.122这对金钱而言并不理想)之外,它设置得很好。


有没有办法将小数点后的字符数限制为两个?


慕村9548890
浏览 884回答 3
3回答

精慕HU

不使用正则表达式的简单解决方案:import android.text.InputFilter;import android.text.Spanned;/**&nbsp;* Input filter that limits the number of decimal digits that are allowed to be&nbsp;* entered.&nbsp;*/public class DecimalDigitsInputFilter implements InputFilter {&nbsp; private final int decimalDigits;&nbsp; /**&nbsp; &nbsp;* Constructor.&nbsp; &nbsp;*&nbsp;&nbsp; &nbsp;* @param decimalDigits maximum decimal digits&nbsp; &nbsp;*/&nbsp; public DecimalDigitsInputFilter(int decimalDigits) {&nbsp; &nbsp; this.decimalDigits = decimalDigits;&nbsp; }&nbsp; @Override&nbsp; public CharSequence filter(CharSequence source,&nbsp; &nbsp; &nbsp; int start,&nbsp; &nbsp; &nbsp; int end,&nbsp; &nbsp; &nbsp; Spanned dest,&nbsp; &nbsp; &nbsp; int dstart,&nbsp; &nbsp; &nbsp; int dend) {&nbsp; &nbsp; int dotPos = -1;&nbsp; &nbsp; int len = dest.length();&nbsp; &nbsp; for (int i = 0; i < len; i++) {&nbsp; &nbsp; &nbsp; char c = dest.charAt(i);&nbsp; &nbsp; &nbsp; if (c == '.' || c == ',') {&nbsp; &nbsp; &nbsp; &nbsp; dotPos = i;&nbsp; &nbsp; &nbsp; &nbsp; break;&nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }&nbsp; &nbsp; if (dotPos >= 0) {&nbsp; &nbsp; &nbsp; // protects against many dots&nbsp; &nbsp; &nbsp; if (source.equals(".") || source.equals(","))&nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return "";&nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; // if the text is entered before the dot&nbsp; &nbsp; &nbsp; if (dend <= dotPos) {&nbsp; &nbsp; &nbsp; &nbsp; return null;&nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; if (len - dotPos > decimalDigits) {&nbsp; &nbsp; &nbsp; &nbsp; return "";&nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }&nbsp; &nbsp; return null;&nbsp; }}使用方法:editText.setFilters(new InputFilter[] {new DecimalDigitsInputFilter(2)});

一只萌萌小番薯

此实现InputFilter解决了问题。import android.text.SpannableStringBuilder;import android.text.Spanned;import android.text.method.DigitsKeyListener;public class MoneyValueFilter extends DigitsKeyListener {&nbsp; &nbsp; public MoneyValueFilter() {&nbsp; &nbsp; &nbsp; &nbsp; super(false, true);&nbsp; &nbsp; }&nbsp; &nbsp; private int digits = 2;&nbsp; &nbsp; public void setDigits(int d) {&nbsp; &nbsp; &nbsp; &nbsp; digits = d;&nbsp; &nbsp; }&nbsp; &nbsp; @Override&nbsp; &nbsp; public CharSequence filter(CharSequence source, int start, int end,&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Spanned dest, int dstart, int dend) {&nbsp; &nbsp; &nbsp; &nbsp; CharSequence out = super.filter(source, start, end, dest, dstart, dend);&nbsp; &nbsp; &nbsp; &nbsp; // if changed, replace the source&nbsp; &nbsp; &nbsp; &nbsp; if (out != null) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; source = out;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; start = 0;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; end = out.length();&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; int len = end - start;&nbsp; &nbsp; &nbsp; &nbsp; // if deleting, source is empty&nbsp; &nbsp; &nbsp; &nbsp; // and deleting can't break anything&nbsp; &nbsp; &nbsp; &nbsp; if (len == 0) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return source;&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; int dlen = dest.length();&nbsp; &nbsp; &nbsp; &nbsp; // Find the position of the decimal .&nbsp; &nbsp; &nbsp; &nbsp; for (int i = 0; i < dstart; i++) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (dest.charAt(i) == '.') {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // being here means, that a number has&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // been inserted after the dot&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // check if the amount of digits is right&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return (dlen-(i+1) + len > digits) ?&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; "" :&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; new SpannableStringBuilder(source, start, end);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; for (int i = start; i < end; ++i) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (source.charAt(i) == '.') {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // being here means, dot has been inserted&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // check if the amount of digits is right&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if ((dlen-dend) + (end-(i + 1)) > digits)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return "";&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; else&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break;&nbsp; // return new SpannableStringBuilder(source, start, end);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; // if the dot is after the inserted part,&nbsp; &nbsp; &nbsp; &nbsp; // nothing can break&nbsp; &nbsp; &nbsp; &nbsp; return new SpannableStringBuilder(source, start, end);&nbsp; &nbsp; }}
随时随地看视频慕课网APP

相关分类

Android
Java
我要回答