edittext实现显示千分位格式

it2022-05-05  76

在edittext中你在输入1123456789过程中自动显示为1,123,456,789这种千分位格式的。那么我们该怎么做呢? 查阅Android edittext api发现它有这样一个方法addTextChangedListener,这个方法就是用来监听用户在输入过程中的事件监听,它会重写这几个方法:

editText.addTextChangedListener(new TextWatcher() {                            @Override              public void onTextChanged(CharSequence s, int start, int before, int count) {                  // TODO Auto-generated method stub                                }                            @Override              public void beforeTextChanged(CharSequence s, int start, int count,                      int after) {                  // TODO Auto-generated method stub                                }                            @Override              public void afterTextChanged(Editable s) {                  // TODO Auto-generated method stub                             }          });  

不难发现。从字面意思理解我们需实现这个功能就需要在afterTextChanged()这个方法中写我们的逻辑代码,代码如下:

@Override  ublic void afterTextChanged(Editable s) {  // TODO Auto-generated method stub  if (!StringUtils.touzi_ed_values22.equals(editText.getText().toString().trim().replaceAll(",",""))) {      editText.setText(StringUtils.addComma(editText.getText().toString().trim().replaceAll(",",""),editText));      editText.setSelection(StringUtils.addComma(editText.getText().toString().trim().replaceAll(",",""),editText).length());  }  

StringUtils.addComma这个方法我是写成了一个帮助类,方便重复调佣

     public static String touzi_ed_values22 = "";        /**       * 在数字型字符串千分位加逗号       * @param str       * @param edtext      * @return sb.toString()      */        public static String addComma(String str,EditText edtext){              touzi_ed_values22 = edtext.getText().toString().trim().replaceAll(",","");                    boolean neg = false;            if (str.startsWith("-")){  //处理负数                str = str.substring(1);                neg = true;            }            String tail = null;            if (str.indexOf('.') != -1){ //处理小数点                tail = str.substring(str.indexOf('.'));                str = str.substring(0, str.indexOf('.'));            }            StringBuilder sb = new StringBuilder(str);            sb.reverse();             for (int i = 3; i < sb.length(); i += 4){                sb.insert(i, ',');            }            sb.reverse();            if (neg){                sb.insert(0, '-');            }            if (tail != null){                sb.append(tail);            }            return sb.toString();        }    

代 码中,我定义了一个静态的变量touzi_ed_values22是为了方便与activity中的 StringUtils.touzi_ed_values22.equals(editText.getText().toString().trim().replaceAll(",","")) 做判断,判断在输入过程中是否不同,也就是数值改变了,如果改变了,那么就会调用addComma()方法返回新的字符串数值赋值给edittext。 其中addComma中的touzi_ed_values22 = edtext.getText().toString().trim().replaceAll(",","");非常关键。它是为了不断获取当前数值与返回后的数值进行比较,如果没有这句代码。你的app将再edittext输入时就会出现卡死现象,因为你的touzi_ed_values22是永远为空的。在作比较的时候会进入该方法,就会无限赋值无限判断。

 

现在就要使用啦!

请直接看代码

1 jewelry_money.addTextChangedListener(new TextWatcher() { 2 @Override 3 public void beforeTextChanged(CharSequence s, int start, int count, int after) { 4 5 } 6 7 @Override 8 public void onTextChanged(CharSequence s, int start, int before, int count) { 9 if (!ValueUtils.touzi_ed_values22.equals(jewelry_money.getText().toString().trim().replaceAll(",",""))) { 10 jewelry_money.setText(ValueUtils.addComma(jewelry_money.getText().toString().trim().replaceAll(",", ""), jewelry_money)); 11 jewelry_money.setSelection(ValueUtils.addComma(jewelry_money.getText().toString().trim().replaceAll(",", ""), jewelry_money).length()); 12 } 13 } 14 15 @Override 16 public void afterTextChanged(Editable s) { 17 18 } 19 });

最后在给大家一个小工具,有时候上传价格的数据时,不允许上传带逗号的,所以在上传之前要去掉逗号啦!

1 public static String getValue(String str){ 2 String[] s = str.split(","); 3 String value = ""; 4 for (int i=0;i<s.length;i++){ 5 value += s[i]; 6 } 7 return value; 8 }

调用这个方法就可以啦

到时在获取数据展示的时候又要加逗号,可以这样解决

1 HttpUtil.post(this, UrlConfig.JEWELRY_DETAIL, params, new HttpUtil.Ok() { 2 @Override 3 public void success(String str) { 4 JSONObject data = JSON.parseObject(str); 5 show_jewelry_name.setText(Helper.value(data.getString("sellerName"), "未知")); 6 show_jewelry_ID.setText(Helper.value(data.getString("sellerId"), "未知")); 7 show_jewelry_phone.setText(Helper.value(data.getString("sellerTel"), "未知")); 8 java.text.NumberFormat nf = java.text.NumberFormat.getInstance(); 9 Double value=data.getDouble("price"); 10 show_jewelry_money.setText(nf.format(value)+"元");

这样又有逗号了

 

哈哈,这才真正的解决了数字的千分位问题

 

转载于:https://www.cnblogs.com/wangying222/p/5757672.html


最新回复(0)