Automatically add dash in phone number in Android

前端 未结 7 2323
-上瘾入骨i
-上瘾入骨i 2020-12-17 21:18

Instead of 5118710, it should be 511-8710. I\'d like to add a dash after the user the user inputted 3 digits already in the EditText. The maximum length of

相关标签:
7条回答
  • 2020-12-17 21:44
    import android.text.Editable;
    import android.text.Selection;
    import android.text.TextWatcher;
    import android.util.Log;
    import android.widget.EditText;
    
    /**
     * Auto-formats a number using -.
     * Ex. 303-333-3333
     * Ex. 1-303-333-3333
     * Doesn't allow deletion of just -
     */
    public class PhoneNumberFormattingTextWatcher implements TextWatcher {
        private static final String TAG = "PhoneNumberTextWatcher";
    
        private final EditText editText;
        private String previousNumber;
    
        /**
         * Indicates the change was caused by ourselves.
         */
        private boolean mSelfChange = false;
    
        public PhoneNumberFormattingTextWatcher(EditText editText) {
            this.editText = editText;
        }
    
        @Override
        public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
    
        }
    
        @Override
        public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
    
        }
    
        @Override
        public void afterTextChanged(Editable editable) {
            // if the previous editable ends with a dash and new is shorter than previous
            // additionally remove preceding character
            Log.i(TAG, "Previous String: " + previousNumber);
    
            //if self change ignore
            if (mSelfChange) {
                Log.i(TAG, "Ignoring self change");
                mSelfChange = false;
                return;
            }
    
            String phoneNumber = removeNonnumeric(editable.toString());
            int stringLength = phoneNumber.length();
    
            //empty case
            if(stringLength == 0) {
                mSelfChange = true;
                editText.setText("");
                return;
            }
    
            boolean startsWithOne = phoneNumber.charAt(0) == '1';
            int maxLength = 10 + (startsWithOne ? 1 : 0);
    
            //too large
            if(stringLength > maxLength) {
                Log.i(TAG, "String length is greater than max allowed, using previous string: " + previousNumber);
                mSelfChange = true;
                editText.setText(previousNumber);
                Editable etext = editText.getText();
                Selection.setSelection(etext, previousNumber.length());
                return;
            }
    
            phoneNumber = formatPhoneNumber(phoneNumber);
    
            if(previousNumber != null && phoneNumber.length() == previousNumber.length()) {
                //user deleting last character, and it is a -
                if(phoneNumber.endsWith("-")) {
                    phoneNumber = phoneNumber.substring(0, phoneNumber.length()-2);
                }
            }
    
            mSelfChange = true;
            previousNumber = phoneNumber;
            editText.setText(phoneNumber);
            Editable etext = editText.getText();
            Selection.setSelection(etext, phoneNumber.length());
        }
    
        private String formatPhoneNumber(String phoneNumber) {
            int stringLength = phoneNumber.length();
            //check if starts with 1, if it does, dash index is increased by 1
            boolean startsWithOne = phoneNumber.charAt(0) == '1';
    
            //if the length of the string is 6, add another dash
            int lastHyphenIndex = 6 + (startsWithOne ? 1 : 0);
            if (stringLength >= lastHyphenIndex) {
                phoneNumber = phoneNumber.substring(0, lastHyphenIndex) + "-" + phoneNumber.substring(lastHyphenIndex, phoneNumber.length());
            }
            //if the length of the string is 3, add a dash
            int secondToLastHyphenIndex = 3 + (startsWithOne ? 1 : 0);
            if (stringLength >= secondToLastHyphenIndex) {
                phoneNumber = phoneNumber.substring(0, secondToLastHyphenIndex) + "-" + phoneNumber.substring(secondToLastHyphenIndex, phoneNumber.length());
            }
            //If the number starts with 1, add a dash after 1
            if (phoneNumber.startsWith("1")) {
                phoneNumber = phoneNumber.substring(0, 1) + "-" + phoneNumber.substring(1, phoneNumber.length());
            }
    
            return phoneNumber;
        }
    
        private static String removeNonnumeric(String text) {
            return text.replaceAll("[^\\d]", "");
        }
    }
    
    0 讨论(0)
提交回复
热议问题