最近很多地方用到了金额输入框,需要控制输入的金额,使其符合一定的条件,之前写过一种控制方法,自己项目上的输入金额要求都是一致的,所以这一种就可以搞定了。
这个方法控制的数字符合的要求如下:只能输入整数或者最多两位小数。
有需要的小伙伴可以参考一下,话不多说,上代码:
先是一个正则,判断数字是否符合要求
/**
* 小数,最多两位小数,如:10.2, 0.25, 20
* @param str
*/
public static boolean isDecimalTwo(String str){
return str.matches("^[1-9]\\d*(\\.\\d{0,2})?|0\\.(0[1-9]?|[1-9]\\d?)?$");
}
再是一个输入监听,利用上面的正则动态改变不符合要求的数字,同时要避免进入死循环(我用了!temp.equals(s.toString()
来控制)……
/**
* 数字输入监听
*/
private class MyTextWatcher implements TextWatcher {
private String temp;
private EditText et;
public MyTextWatcher(EditText editText) {
this.et = editText;
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
temp = s.toString();
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
//输第一个0时不判断
if (s.length() > 0 && !"0".equals(s.toString())) {
if (!isDecimalTwo(s.toString()) && !temp.equals(s.toString())) {
et.setText(temp);
et.setSelection(et.getText().toString().length());
}
}
}
@Override
public void afterTextChanged(Editable s) {
}
}
2017-08-17更新:
之前的写的正则还不够强大,导致在onTextChanged
中需要加!"0".equals(s.toString())
的判断。
现在优化了正则,允许最小数字0,0.00等0形式的输入,可以省去onTextChanged
中累赘的判断,优化后的方法如下:
public static boolean isDecimalTwo(String str) {
return str.matches("^[1-9]\\d*(\\.\\d{0,2})?|0(\\.(\\d{1,2})?)?$");
}