首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Android 实现EditText输入金额

Android 实现EditText输入金额

作者头像
网罗开发
发布2021-01-29 17:10:29
发布2021-01-29 17:10:29
3.3K00
代码可运行
举报
文章被收录于专栏:网罗开发网罗开发
运行总次数:0
代码可运行

1. 介绍

Android中EditText是一个InputType类型有很多的控件,可以来达到不同的软键盘效果。如下图:

InputType类型

在最近在项目中要实现EditText输入金额,金额的限制因素很多,比如,只能输入数字和小数点,首位不能输入0和小数点,小数点后面只能保留两位等等,这些仅仅用InputType是无法实现的,所以就用InputFilter来实现。

2. 设置EditText的InputType

需要将EditText的InputType设置成如下格式,保证用户只能输入小数点和数字:

代码语言:javascript
代码运行次数:0
运行
复制
android:inputType="numberDecimal"

或者

代码语言:javascript
代码运行次数:0
运行
复制
setInputType(InputType.TYPE_NUMBER_FLAG_DECIMAL)

3. 自定义InputFilter,代码如下:

CashierInputFilter.java

代码语言:javascript
代码运行次数:0
运行
复制
package demopay.InputFilter;import android.text.InputFilter;
import android.text.Spanned;
import android.text.TextUtils;import java.util.regex.Matcher;
import java.util.regex.Pattern;/**
* Created by fby on 2017/9/7.
 * 过滤用户输入只能为金额格式
*/public class CashierInputFilter implements InputFilter {
   Pattern mPattern;   //输入的最大金额
   private static final int MAX_VALUE = Integer.MAX_VALUE;
   //小数点后的位数
   private static final int POINTER_LENGTH = 2;   private static final String POINTER = ".";   private static final String ZERO = "0";   public CashierInputFilter() {
       mPattern = Pattern.compile("([0-9]|\\.)*");
   }   /**
    * @param source    新输入的字符串
    * @param start     新输入的字符串起始下标,一般为0
    * @param end       新输入的字符串终点下标,一般为source长度-1
    * @param dest      输入之前文本框内容
    * @param dstart    原内容起始坐标,一般为0
    * @param dend      原内容终点坐标,一般为dest长度-1
    * @return          输入内容
    */
   @Override
   public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
       String sourceText = source.toString();
       String destText = dest.toString();       //验证删除等按键
       if (TextUtils.isEmpty(sourceText)) {
           return "";
       }       Matcher matcher = mPattern.matcher(source);
       //已经输入小数点的情况下,只能输入数字
       if(destText.contains(POINTER)) {
           if (!matcher.matches()) {
               return "";
           } else {
               if (POINTER.equals(source.toString())) {  //只能输入一个小数点
                   return "";
               }
           }           //验证小数点精度,保证小数点后只能输入两位
           int index = destText.indexOf(POINTER);
           int length = dend - index;           if (length > POINTER_LENGTH) {
               return dest.subSequence(dstart, dend);
           }
       } else {
           /**
            * 没有输入小数点的情况下,只能输入小数点和数字
            * 1. 首位不能输入小数点
            * 2. 如果首位输入0,则接下来只能输入小数点了
            */
           if (!matcher.matches()) {
               return "";
           } else {
               if ((POINTER.equals(source.toString())) && TextUtils.isEmpty(destText)) {  //首位不能输入小数点
                   return "";
               } else if (!POINTER.equals(source.toString()) && ZERO.equals(destText)) { //如果首位输入0,接下来只能输入小数点
                   return "";
               }
           }
       }       //验证输入金额的大小
       double sumText = Double.parseDouble(destText + sourceText);
       if (sumText > MAX_VALUE) {
           return dest.subSequence(dstart, dend);
       }       return dest.subSequence(dstart, dend) + sourceText;
   }
}

4. CashierInputFilter.java 使用方法

在onCreate中写入代码,moneyEditText为输入框

代码语言:javascript
代码运行次数:0
运行
复制
    @Override
   protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.activity_first);       moneyEditText = (EditText) findViewById(R.id.EditText);
       InputFilter[] filters = {new CashierInputFilter()};
       moneyEditText.setFilters(filters);   }
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2017-10-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 网罗开发 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 介绍
  • 2. 设置EditText的InputType
  • 3. 自定义InputFilter,代码如下:
  • 4. CashierInputFilter.java 使用方法
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档