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

Android EditText实现输入金额类型详解,第1张

概述前言众所周知,Android中的editText默认的属性里面是没有金额类型的,所以要实现这个功能我们就必须自己动手丰衣足食。下面话不多说了,来一起看看详细的介绍吧。

前言

众所周知,AndroID中的editText默认的属性里面是没有金额类型的,所以要实现这个功能我们就必须自己动手丰衣足食。下面话不多说了,来一起看看详细的介绍吧。

一.EditText只允许输入数字、小数点。

首先要知道金额有两部分构成,整数部分和小数部分,要实现只输入数字和小数点很简单。自己查能很容易查到。

把type设置成inputType.TYPE_NUMBER_FLAG_DECIMAL|inputType.TYPE_CLASS_NUMBER 就行

那这样做有个缺点,小数部分可以有很多位。而我们知道金额类型的小数部分只能有两位,所以这个方法不合适。

二.设置字符过滤

网上有很多文章都是这样写。

mEdit.setFilters(new inputFilter[]{new inputFilter() { @OverrIDe public CharSequence filter(CharSequence source,int start,int end,Spanned dest,int dstart,int dend) {  if(source.equals(".") && dest.toString().length() == 0){   return "0.";  }  if(dest.toString().contains(".")){   int index = dest.toString().indexOf(".");   int mlength = dest.toString().substring(index).length();   if(mlength == 3){    return "";   }  }  return null; }}});

这样的做法能实现是能实现,但是这样的写法没有考虑到很多种会出现的情况,也就是说只是这样写的话,在某些情况下的用户体验很不好。

三.设置监听addTextChangedListener

上面的第二种方法你可以在里边加自己的算法来处理特殊情况,但是我不太喜欢这个方法,直到我看到一个哥们用addTextChangedListener来实现。我才发现,用addTextChangedListener来做金额类型的输入挺合适的。虽然也是要自己写算法去解决特殊情况下的问题,但是用起来比第二种方法舒服。

我先贴代码再做解释。

public class EditTextUtils { /**  * 设置edittext只能输入小数点后两位  */ public static voID afterDottwo(final EditText editText) {  editText.addTextChangedListener(new TextWatcher() {   @OverrIDe   public voID onTextChanged(CharSequence s,int before,int count) {    // 限制最多能输入9位整数    if (s.toString().contains(".")) {     if (s.toString().indexOf(".") > 9) {      s = s.toString().subSequence(0,9) + s.toString().substring(s.toString().indexOf("."));      editText.setText(s);      editText.setSelection(9);     }    }else {     if (s.toString().length() > 9){      s = s.toString().subSequence(0,9);      editText.setText(s);      editText.setSelection(9);     }    }    // 判断小数点后只能输入两位    if (s.toString().contains(".")) {     if (s.length() - 1 - s.toString().indexOf(".") > 2) {      s = s.toString().subSequence(0,s.toString().indexOf(".") + 3);      editText.setText(s);      editText.setSelection(s.length());     }    }    //如果第一个数字为0,第二个不为点,就不允许输入    if (s.toString().startsWith("0") && s.toString().trim().length() > 1) {     if (!s.toString().substring(1,2).equals(".")) {      editText.setText(s.subSequence(0,1));      editText.setSelection(1);      return;     }    }   }   @OverrIDe   public voID beforeTextChanged(CharSequence s,int count,int after) {   }   @OverrIDe   public voID afterTextChanged(Editable s) {    if (editText.getText().toString().trim() != null && !editText.getText().toString().trim().equals("")) {     if (editText.getText().toString().trim().substring(0,1).equals(".")) {      editText.setText("0" + editText.getText().toString().trim());      editText.setSelection(1);     }    }   }  }); }}

我先把我工具类中的其它方法屏蔽调,只留这个方法。你会看到算法的代码量不算稍微有点杂。这是我参考那哥们写的再加上自己碰到的特殊需求改进的。当然每个人都应该根据自己的需求去写不同的算法。

但是至少先要掌握两点:addTextChangedListener的了解和Java String字符串的一些基本 *** 作。

我这里做了4种情况的判断:

1. 限制整数只能输入多位

我这边的需求是整数最多为9位数,所以我先判断是否有小数点,有的话就获取前面9位加上小数点以及其后所有。

    if (s.toString().contains(".")) {     if (s.toString().indexOf(".") > 9) {      s = s.toString().subSequence(0,9);      editText.setText(s);      editText.setSelection(9);     }    }

2. 限制小数点后只能输两位

这个判断是判断金额的重点,本来金额小数点后就只能有两位,当然有些人的需求可能是只能有一位,这不要紧,把数字改下就行。首先判断是否有小数点,如果有,判断是否小数点后大于两位,如果大于就只取前两位。

    if (s.toString().contains(".")) {     if (s.length() - 1 - s.toString().indexOf(".") > 2) {      s = s.toString().subSequence(0,s.toString().indexOf(".") + 3);      editText.setText(s);      editText.setSelection(s.length());     }    }

3.第一个数为0的情况

我这里写的判断不是很好,之后可以改进。这个特殊情况是这样的,假如你输入的第一位是0,你想想,你能输入0233,05这种数字吗,就是您能,这样展示给用户的效果也很不友好,所以要判断如果第一位数是0,第二位不是小数点的话,就输出0。

    if (s.toString().startsWith("0") && s.toString().trim().length() > 1) {     if (!s.toString().substring(1,1));      editText.setSelection(1);      return;     }    }

上面也说了这步的算法有两个问题,第一,如果在0.26的情况下,我把光标点在0后面,输入一个不为0的数字假设5,得到的结果是0而不是5.26。第二,假如还是0.26的情况下,我把光标点在小数点后面,删除小数点,得到的不是26而是0。所以这步的算法有些问题。那为什么不现在改呢,不好意思,最近太忙,写文章都很赶。

4.第一个是小数点的情况

假如你的数是5.26,这时候你把光标放到5后面,删除5,如果你不做处理,那展示出来的就是.26,这样的展示就很不友好,所以我们要想办法要在第一位为小数点的情况下补0。

   public voID afterTextChanged(Editable s) {    if (editText.getText().toString().trim() != null && !editText.getText().toString().trim().equals("")) {     if (editText.getText().toString().trim().substring(0,1).equals(".")) {      editText.setText("0" + editText.getText().toString().trim());      editText.setSelection(1);     }    }   }

这里写在afterTextChanged里面,所以让大家先要了解addTextChangedListener再来看算法,写在afterTextChanged里面是因为我要在“之后”做 *** 作。算法也很简单,判断有字符串并且第一位为小数点的情况下,添加个0在前面。

因为这个算法是很赶的情况下写的,很多地方也许可以合并,可能也有一些特殊的情况没有考虑到,最好不要直接拿来用,我只是举个栗子说明addTextChangedListener能很好的实现这个功能,具体要怎么实现还需要根据个人自己的需求和特殊情况去写算法。

四.最方便的方法

没错,要实现这个功能的最方便方法就是......跪求谷歌在下一个版本添加一个MONEY类型的TYPE,这样就是一行代码的事情了,呵呵。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对编程小技巧的支持。

总结

以上是内存溢出为你收集整理的Android EditText实现输入金额类型详解全部内容,希望文章能够帮你解决Android EditText实现输入金额类型详解所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1144477.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-31
下一篇 2022-05-31

发表评论

登录后才能评论

评论列表(0条)

保存