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 start, 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 start, 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) + 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);
     }
    }

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, 2).equals(".")) {
      editText.setText(s.subSequence(0, 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,这样就是一行代码的事情了,呵呵。

总结

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

(0)

相关推荐

  • Android实现EditText输入金额

    EditText是Android中一个非常实用的控件,有很多InputType,可以来达到不同的输入效果,如下图: 比如,密码输入,数字输入等等.但是最近在项目中要实现EditText输入金额,金额的限制因素很多,比如,只能输入数字和小数点,首位不能输入0和小数点,小数点后面只能保留两位等等,这些仅仅用InputType是无法实现的,今天用InputFilter来实现. 1. 首先需要将EditText的InputType设置成如下格式,保证用户只能输入小数点和数字 android:inputT

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

    前言 众所周知,Android中的editText默认的属性里面是没有金额类型的,所以要实现这个功能我们就必须自己动手丰衣足食.下面话不多说了,来一起看看详细的介绍吧. 一.EditText只允许输入数字.小数点. 首先要知道金额有两部分构成,整数部分和小数部分,要实现只输入数字和小数点很简单.自己查能很容易查到. 把type设置成InputType.TYPE_NUMBER_FLAG_DECIMAL|InputType.TYPE_CLASS_NUMBER 就行 那这样做有个缺点,小数部分可以有很

  • Android EditText限制输入字符类型的方法总结

    Android EditText限制输入字符类型的方法总结 前言: 最近的项目上需要限制EditText输入字符的类型,就把可以实现这个功能的方法整理了一下: 1.第一种方式是通过EditText的inputType来实现,可以通过xml或者Java文件来设置.假如我要设置为显示密码的形式,可以像下面这样设置: 在xml中 Android:inputType="textPassword" 在java文件中,可以用 myEditText.setInputType(InputType.TY

  • 易语言的输入字类型详解

    在程序中书写输入字时,可以使用一个半角符号来引导该输入字,以指定其类型.各输入字的类型引导符号为: 首拼及全拼输入字: 分号(";") 如: ;qz(1.23) 或 ;quzheng(1.23) 双拼输入字: 冒号(":") 如: :quvg(1.23) 英文输入字: 单引号(" '") 如: 'int(1.23) 系统具有一个当前默认输入法状态,如果某输入字前没有加上类型引导符号,则默认是属于该输入法的输入字.系统安装完毕后,当前默认输入法为&

  • Layui数据表格判断编辑输入的值,是否为我需要的类型详解

    因为很多使用layui插件做的表格都需要用到layui的表格编辑事件,但是编辑事件是可以随意输入值的,但是如果当我们的字段为数量的时候,又需要获取到数量传进控制器进行数据处理的时候,而控制器接收的数量为int类型.倘若我输入的数量不是整数类型,那么就无法传进控制器,直接报404,找不到url中的方法 所有在使用重载前,最好先对用户输入的值进行一下判断,判断是否符合条件,允许传进控制器 比如我项目中的表格 我这个项目要求是,当用户输入的数量大于该商品在该仓库的库存时,就会提醒用户,并且将数量的值,

  • Android USB转串口通信开发实例详解

     Android USB转串口通信开发实例详解 好久没有写文章了,年前公司新开了一个项目,是和usb转串口通信相关的,需求是用安卓平板通过usb转接后与好几个外设进行通信,一直忙到最近,才慢慢闲下来,趁着这个周末不忙,记录下usb转串口通信开发的基本流程. 我们开发使用的是usb主机模式,即:安卓平板作为主机,usb外设作为从机进行数据通信.整个开发流程可以总结为以下几点: 1.发现设备 UsbManager usbManager = (UsbManager) context.getSystem

  • Android实现屏幕锁定源码详解

    最近有朋友问屏幕锁定的问题,自己也在学习,网上找了下也没太详细的例子,看的资料书上也没有有关屏幕锁定程序的介绍,下个小决心,自己照着官方文档学习下,现在做好了,废话不多说,先发下截图,看下效果,需要注意的地方会加注释,有问题的朋友可以直接留言,我们共同学习交流,共同提高进步!直接看效果图: 一:未设置密码时进入系统设置的效果图如下: 二:设置密码方式预览: 三:密码解密效果图 四:九宫格解密时的效果图 下面来简单的看下源码吧,此处讲下,这个小DEMO也是临时学习下的,有讲的不明白的地方请朋友直接

  • Android Studio开发环境搭建教程详解

    对于移动端这块,笔者之前一直都是进行iOS开发的,也从来没用过Java.但是因为进入了Google Android全国大学生移动互联网创新挑战赛(进入官网)的总决赛(笔者"西部计算机教育提升计划"的项目被直接推荐进入决赛),这个比赛要求一定要提交apk程序,所以我不得不赶紧学习一下Android开发了. 下面就对自己学习的过程做一个记录. 一.安装Android Studio 笔者用的计算机配置如下: Mac下安装Android Studio应该更简单一些,只需要下载一个Android

  • Android AlertDialog六种创建方式案例详解

    目录 一.setMessage:设置对话框内容为简单文本内容 二.setItem:设置文本框内容为简单列表项 三.setSingleChoiceItems()设置对话框内容为单选列表项 四.setMultiChoiceItems()设置对话框内容为多选项列表 五.setAdapter()设置对话框内容为自定义列表项(这里是一个布局) 六.setView()设置对话框为自定义View 创建AlertDialog的步骤: 创建AlertDialog.Builder对象 调用Builder对象的set

  • Android AlertDialog多种创建方式案例详解

    目录 一.setMessage:设置对话框内容为简单文本内容 二.setItem:设置文本框内容为简单列表项 三.setSingleChoiceItems()设置对话框内容为单选列表项 四.setMultiChoiceItems()设置对话框内容为多选项列表 五.setAdapter()设置对话框内容为自定义列表项(这里是一个布局) 六.setView()设置对话框为自定义View 创建AlertDialog的步骤: 创建AlertDialog.Builder对象 调用Builder对象的set

  • Android TextView的TextWatcher使用案例详解

    TextWatcher是一个文本变化监听接口,定义了三个接口,分别是beforeTextChanged,onTextChanged,afterTextCahnged. TextWatcher通常与TextView结合使用,以便在文本变化的不同时机做响应的处理.TextWatcher中三个回调接口都是使用了InputFilter过滤器过滤之后的文字字符作为新的字符对象. 使用方法 mTextView.addTextChangedListener(new TextWatcher(){ @Overri

随机推荐