Android EditText实现输入金额类型详解

  

  

众所周知,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。

     

Android EditText实现输入金额类型详解