EditText输入时显示千分符“,”

1.自定义EditText控件
public class DivisionEditText extends EditText {
    /* 每组的长度 */
    private Integer length = 3;
    /* 分隔符 */
    private String delimiter = ",";

    private String text = "";

    public DivisionEditText(Context context) {
        super(context);
        init();
    }

    public DivisionEditText(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public DivisionEditText(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        init();
    }
    /** 得到每组个数 */
    public Integer getLength() {
        return length;
    }

    /** 设置每组个数 */
    public void setLength(Integer length) {
        this.length = length;
    }

    /** 得到间隔符 */
    public String getDelimiter() {
        return delimiter;
    }

    /** 设置间隔符 */
    public void setDelimiter(String delimiter) {
        this.delimiter = delimiter;
    }

    public String getInputText() {
        return super.getText().toString().replace(getDelimiter(), "");
    }

    /**
     * 初始化
     */
    public void init() {

        // 内容变化监听
        this.addTextChangedListener(new DivisionTextWatcher());
        // 获取焦点监听
        this.setOnFocusChangeListener(new DivisionFocusChangeListener());
    }

    /**
     * 文本监听
     *
     * @author Administrator
     *
     */
    private class DivisionTextWatcher implements TextWatcher {

        @Override
        public void afterTextChanged(Editable s) {
        }

        @Override
        public void beforeTextChanged(CharSequence s, int start, int count,
                                      int after) {
        }

        @Override
        public void onTextChanged(CharSequence s, int start, int before,int count) {
            // 统计个数
            int len = s.length();
            if (len < getLength())// 长度小于要求的数
                return;
            if (count > 1) {
                return;
            }
            //先倒置,运算之后再倒置回来
            text = inversionString(formatSymbol(inversionString(s.toString())));//关键点
            setText(text);
            setSelection(text.length());
        }
    }
    /**
    * 若有,先去除,进行计算之后再添加
    */  
    private String formatSymbol(String str) {
        char[] chars = str.replace(getDelimiter(), "").toCharArray();
        StringBuffer sb = new StringBuffer();
        
        for (int i = 0; i < chars.length; i++) {
            if (i % getEachLength() == 0 && i != 0)// 每次遍历到4的倍数,就添加一个空格
            {
                sb.append(getDelimiter());
                sb.append(chars[i]);// 添加字符
            } else {
                sb.append(chars[i]);// 添加字符
            }
        }       
        return sb.toString();
    }

    /**
     * 字符串逆序*
     * @param str
     * @return
     */
    private String inversionString(String str) {
        char[] chars = str.toCharArray();
        StringBuffer sb = new StringBuffer();
        for(int i= 0; i < chars.length; i++) {
            sb.append(chars[chars.length - i - 1]);
        }        
        return sb.toString();
    }

    /**
     * 获取焦点监听
     *
     * @author Administrator
     *
     */
    private class DivisionFocusChangeListener implements OnFocusChangeListener {

        @Override
        public void onFocusChange(View v, boolean hasFocus) {
            if (hasFocus) {
                // 设置焦点
                setSelection(getText().toString().length());
            }
        }
    } 
}
时间: 2024-12-12 12:03:50

EditText输入时显示千分符“,”的相关文章

Delphi Inputbox 输入时显示‘*’

unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; const InputboxMessage = WM_USER + 200; //定义消息 type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject

js解决千分符问题

js脚本function: //js数字千分符处理 function commafy(num) { num = num + ""; var re = /(-?\d+)(\d{3})/ while (re.test(num)) { num = num.replace(re, "$1,$2") } return num; }

js-格式化数字保留两位小数-带千分符

很多时候发现有时候js会提示自带函数不能使用,所以自己找了很多资料实现了个 html <input type="text" class="input_text input_number" name="mgsy_dbnfjlr" value="" onblur="this.value=fouces_qfh(this.value)" /> js函数 function fouces_qfh(obj){

java 数字转为千分符格式字符串,将千分符格式字符串反转为数字

int a = 2000;String str = NumberFormat.getIntegerInstance(Locale.getDefault()).format(a); //转为千分符字符串System.out.println(str); try { int b = NumberFormat.getIntegerInstance(Locale.getDefault()).parse(str).intValue(); //转为数字 System.out.println("" +

js解决千分符问题[收藏下]

//js数字千分符处理 function commafy(num) { num = num + ""; var re = /(-?\d+)(\d{3})/ while (re.test(num)) { num = num.replace(re, "$1,$2") } return num; } 执行下,效果不错,收藏记录

js-处理千分符

/** * 去除千分符 */ function commafyback(num) { var x = num.split(','); return parseFloat(x.join("")); } /** * 增加千分符 */ function commafy(num) { num = num.toFixed(2) + ""; var re = '/(-?/d+)(/d{3})/'; while (re.test(num)) { num = num.replace

JS 正则中环视(断言)应用 -- 数字千分符

介绍一下顺序环视 (?=...) 和逆序环视 (?<=...) 方便不想看长文的人,如果在支持 ES2018 的环境中整数可以这样使用: String(12345678).replace(/(?<=\d)(?=(\d{3})+\b)/g, ',') // "12,345,678" 其中最关键的是肯定顺序环视(?=...),也叫零宽度正预测先行断言.添加千分符麻烦的地方在于只有在从右到左 3 的倍数的位数和前面的数字中间需要添加逗号而正则是从左到右匹配的,这时候就需要用到顺序

模拟百度搜索框,输入时显示历史记录

今天写了个小demo,利用本地存储的特点,模拟百度搜索框. 主要知识是利用本地存储的特点,模拟百度搜索时的历史记录显示. 主要HTML代码为 <div class="search"> <input type="text"/> <button class="btn">搜索</button> </div> <ul class="hidden"> <li&

Python数字加千分符

1.最简单的内置format函数: >>> format(1234567890,',') '1,234,567,890' 2.正则表达式: import re def formatNum(num): num=str(num) pattern=r'(\d+)(\d{3})((,\d{3})*)' while True: num,count=re.subn(pattern,r'\1,\2\3',num) if count==0: break return num if __name__=='