众所周知,Android中的editText默认的属性里面是没有金额类型的,所以要实现这个功能我们就必须自己动手丰衣足食。下面话不多说了,来一起看看详细的介绍吧。
首先要知道金额有两部分构成,整数部分和小数部分,要实现只输入数字和小数点很简单。自己查能很容易查到。
把类型设置成<代码> InputType.TYPE_NUMBER_FLAG_DECIMAL | InputType。TYPE_CLASS_NUMBER> 代码就行
那这样做有个缺点,小数部分可以有很多位。而我们知道金额类型的小数部分只能有两位,所以这个方法不合适。
网上有很多文章都是这样写。
mEdit。setFilters(新InputFilter[]{新InputFilter () { @Override 公共CharSequence进行过滤(CharSequence进行源,int, int,跨越了桌子、int dstart, int dend) { 如果(source.equals(“。”),和dest.toString () . length ()==0) { 返回“0。”; } 如果(dest.toString () .contains (“。”)) { int指数=dest.toString () .indexOf (“。”); int mlength=dest.toString () .substring(索引). length (); 如果(mlength==3) { 返回"; } } 返回null; } }});
这样的做法能实现是能实现,但是这样的写法没有考虑到很多种会出现的情况,也就是说只是这样写的话,在某些情况下的用户体验很不好。
上面的第二种方法你可以在里边加自己的算法来处理特殊情况,但是我不太喜欢这个方法,直到我看到一个哥们用addTextChangedListener来实现。我才发现,用addTextChangedListener来做金额类型的输入挺合适的。虽然也是要自己写算法去解决特殊情况下的问题,但是用起来比第二种方法舒服。
<强>我先贴代码再做解释。强>
公开课EditTextUtils {/* * *设置edittext只能输入小数点后两位 */公共静态孔隙afterDotTwo(最终EditText EditText) { editText。addTextChangedListener(新TextWatcher () { @Override 公共空间> 如果(s.toString () .contains (“。”)) { 如果(s.toString () .indexOf(“。”)在9){ s=s.toString () .subSequence (0, 9) + s.toString () .substring (s.toString () .indexOf (“。”); editText.setText(年代); editText.setSelection (9); } 其他}{ 如果(s.toString () . length()比;9){ s=s.toString () .subSequence (0, 9); editText.setText(年代); editText.setSelection (9); } }
<强> 2。限制小数点后只能输两位强>
这个判断是判断金额的重点,本来金额小数点后就只能有两位,当然有些人的需求可能是只能有一位,这不要紧,把数字改下就行,首先判断是否有小数点,如果有,判断是否小数点后大于两位,如果大于就只取前两位。
如果(s.toString () .contains (“。”)) { 如果(s.length ()——1 - s.toString () .indexOf(“。”)在2){ s=s.toString () .subSequence (0, s.toString () .indexOf (“。”) + 3); editText.setText(年代); editText.setSelection (s.length ()); } }
<强> 3。第一个数为0的情况强>
我这里写的判断不是很好,之后可以改进。这个特殊情况是这样的,假如你输入的第一位是0,你想的想,你能输入0233年05这种数字吗,就是您能,这样展示给用户的效果也很不友好,所以要判断如果第一位数是0,第二位不是小数点的话,就输出0。
如果(s.toString () .startsWith (“0”),,.trim s.toString () () . length()比;1){ 如果(! s.toString ()。substring (1、2) .equals (“。”)) { editText.setText (s。子序列(0,1)); editText.setSelection (1); 返回; } }
上面也说了这步的算法有两个问题,第一,如果在0.26的情况下,我把光标点在0后面,输入一个不为0的数字假设5,得到的结果是0而不是5.26。第二,假如还是0.26的情况下,我把光标点在小数点后面,删除小数点,得到的不是26日而是0,所以这步的算法有些问题。那为什么不现在改呢,不好意思,最近太忙,写文章都很赶。
<>强4。第一个是小数点的情况强>
假如你的数是5.26,这时候你把光标放后到5面,删除5,如果你不做处理,那展示出来的就是点,这样的展示就很不友好,所以我们要想办法要在第一位为小数点的情况下补0。