How to format the input of EditText when typing with thousands separators (,) in Android?

前端 未结 3 1047
春和景丽
春和景丽 2021-02-04 11:54

I\'ve an edittext , it only gets numeric without decimal numbers.

android:inputType=\"number\"

I want to separate thousands while

3条回答
  •  轻奢々
    轻奢々 (楼主)
    2021-02-04 12:12

    Test this example:

    import java.text.DecimalFormat;
    import java.text.ParseException;
    
    import android.text.Editable;
    import android.text.TextWatcher;
    import android.widget.EditText;
    
    public class NumberTextWatcher implements TextWatcher {
    
        private DecimalFormat df;
        private DecimalFormat dfnd;
        private boolean hasFractionalPart;
    
        private EditText et;
    
        public NumberTextWatcher(EditText et)
        {
            df = new DecimalFormat("#,###.##");
            df.setDecimalSeparatorAlwaysShown(true);
            dfnd = new DecimalFormat("#,###");
            this.et = et;
            hasFractionalPart = false;
        }
    
        @SuppressWarnings("unused")
        private static final String TAG = "NumberTextWatcher";
    
        @Override
        public void afterTextChanged(Editable s)
        {
            et.removeTextChangedListener(this);
    
            try {
                int inilen, endlen;
                inilen = et.getText().length();
    
                String v = s.toString().replace(String.valueOf(df.getDecimalFormatSymbols().getGroupingSeparator()), "");
                Number n = df.parse(v);
                int cp = et.getSelectionStart();
                if (hasFractionalPart) {
                    et.setText(df.format(n));
                } else {
                    et.setText(dfnd.format(n));
                }
                endlen = et.getText().length();
                int sel = (cp + (endlen - inilen));
                if (sel > 0 && sel <= et.getText().length()) {
                    et.setSelection(sel);
                } else {
                    // place cursor at the end?
                    et.setSelection(et.getText().length() - 1);
                }
            } catch (NumberFormatException nfe) {
                // do nothing?
            } catch (ParseException e) {
                // do nothing?
            }
    
            et.addTextChangedListener(this);
        }
    
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after)
        {
        }
    
        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count)
        {
            if (s.toString().contains(String.valueOf(df.getDecimalFormatSymbols().getDecimalSeparator())))
            {
                hasFractionalPart = true;
            } else {
                hasFractionalPart = false;
            }
        }
    
    }
    

    To use it, add a TextChangedListener to the EditText component.

    editText.addTextChangedListener(new NumberTextWatcher(editText));
    

提交回复
热议问题