如何限制用户在编辑文本上放置两个以上的小数点

时间:2011-12-30 05:54:39

标签: android

我们有Edittext,它可以取十进制值。所以我用过

android:inputType="numberDecimal"
android:numeric="decimal"  

现在EditText采用十进制值。我的查询是否可以控制用户输入最多两位小数?

例如1345.99,小数点后不能超过两位数。

4 个答案:

答案 0 :(得分:3)

可以有两个解决方案,

1)让用户在输入类似xxx.xx之后不允许。

2)让他输入,当保存值或在屏幕上执行操作时,如果输入的值不是所需的格式,请检查edittext的值并生成吐司。

第二个解决方案,你去。 /

    String str = editText.getText().toString();

    int indexOFdec =  str.indexOf(".");

    if(indexOFdec >=0) {
       if(str.substring(indexOFdec).length() >2)
       {
           Toast.makeText(getApplicationContext(), "Print a message here", Toast.LENGTH_SHORT).show();
           return;
       }
    }

让我知道它是否有效。

答案 1 :(得分:1)

虽然我不确定您是否可以在XML中执行此操作,但一个好的解决方法是在调用getText.toString()之后创建EditText的子字符串并提取必要的标记。只需查找十进制字符“。”在String中并在其后提取2个索引。

答案 2 :(得分:1)

我在另一个网站上发现了这个,但是我不会让我链接,说这个内容不允许在答案中。

InputFilter的这种实现解决了这个问题:

import android.text.SpannableStringBuilder;
import android.text.Spanned;
import android.text.method.DigitsKeyListener;

public class MoneyValueFilter extends DigitsKeyListener {
public MoneyValueFilter() {
    super(false, true);
}

private int digits = 2;

public void setDigits(int d) {
    digits = d;
}

@Override
public CharSequence filter(CharSequence source, int start, int end,
        Spanned dest, int dstart, int dend) {
    CharSequence out = super.filter(source, start, end, dest, dstart, dend);

    // if changed, replace the source
    if (out != null) {
        source = out;
        start = 0;
        end = out.length();
    }

    int len = end - start;

    // if deleting, source is empty
    // and deleting can't break anything
    if (len == 0) {
        return source;
    }

    int dlen = dest.length();

    // Find the position of the decimal .
    for (int i = 0; i < dstart; i++) {
        if (dest.charAt(i) == '.') {
            // being here means, that a number has
            // been inserted after the dot
            // check if the amount of digits is right
            return (dlen-(i+1) + len > digits) ? 
                "" :
                new SpannableStringBuilder(source, start, end);
        }
    }

    for (int i = start; i < end; ++i) {
        if (source.charAt(i) == '.') {
            // being here means, dot has been inserted
            // check if the amount of digits is right
            if ((dlen-dend) + (end-(i + 1)) > digits)
                return "";
            else
                break;  // return new SpannableStringBuilder(source, start, end);
        }
    }

    // if the dot is after the inserted part,
    // nothing can break
    return new SpannableStringBuilder(source, start, end);
}
}

答案 3 :(得分:0)

使用TextWatcher检查EditText包含的点数。如果点的数量多于EditText的一个编辑文本。

EditText et = new EditText(this);

et.addTextChangedListener(new TextWatcher() {
public void onTextChanged(CharSequence s, int start, int before, int count) {
}

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

public void afterTextChanged(Editable s) {
// Logic to check how many points does contain your EditText
}

});