Android 如何在EditText中输入数字时自动添加千个分隔符

Android 如何在EditText中输入数字时自动添加千个分隔符,android,android-layout,android-edittext,android-emulator,number-formatting,Android,Android Layout,Android Edittext,Android Emulator,Number Formatting,我正在创建一个转换器应用程序。我想设置EditText,这样当用户输入要转换的数字时,当数字增加3位数时,应自动实时向数字添加1000个分隔符(,):千、百万、十亿等。 当删除到4位数以下时,数字将恢复正常。 有什么帮助吗?您可以使用String.format()格式说明符中的逗号起作用。 import android.text.Editable; import android.text.TextWatcher; import android.widget.EditTex

我正在创建一个转换器应用程序。我想设置EditText,这样当用户输入要转换的数字时,当数字增加3位数时,应自动实时向数字添加1000个分隔符(
):千、百万、十亿等。
当删除到4位数以下时,数字将恢复正常。

有什么帮助吗?

您可以使用
String.format()格式说明符中的逗号起作用。

    import android.text.Editable;
    import android.text.TextWatcher;
    import android.widget.EditText;

    import java.text.DecimalFormat;


    /**
     * Created by srv_twry on 4/12/17.
     * Source: https://stackoverflow.com/a/34265406/137744
     * The custom TextWatcher that automatically adds thousand separators in EditText.
     */

    public class ThousandSeparatorTextWatcher implements TextWatcher {

        private DecimalFormat df;
        private EditText editText;
        private static String thousandSeparator;
        private static String decimalMarker;
        private int cursorPosition;

        public ThousandSeparatorTextWatcher(EditText editText) {
            this.editText = editText;
            df = new DecimalFormat("#,###.##");
            df.setDecimalSeparatorAlwaysShown(true);
            thousandSeparator = Character.toString(df.getDecimalFormatSymbols().getGroupingSeparator());
            decimalMarker = Character.toString(df.getDecimalFormatSymbols().getDecimalSeparator());
        }

        @Override
        public void beforeTextChanged(CharSequence charSequence, int start, int count, int after) {
            cursorPosition = editText.getText().toString().length() - editText.getSelectionStart();
        }

        @Override
        public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {}

        @Override
        public void afterTextChanged(Editable s) {
            try {
                editText.removeTextChangedListener(this);
                String value = editText.getText().toString();

                if (value != null && !value.equals("")) {
                    if (value.startsWith(decimalMarker)) {
                        String text = "0" + decimalMarker;
                        editText.setText(text);
                    }
                    if (value.startsWith("0") && !value.startsWith("0" + decimalMarker)) {
                        int index = 0;
                        while (index < value.length() && value.charAt(index) == '0') {
                            index++;
                        }
                        String newValue = Character.toString(value.charAt(0));
                        if (index != 0) {
                            newValue = value.charAt(0) + value.substring(index);
                        }
                        editText.setText(newValue);
                    }
                    String str = editText.getText().toString().replaceAll(thousandSeparator, "");
                    if (!value.equals("")) {
                        editText.setText(getDecimalFormattedString(str));
                    }
                    editText.setSelection(editText.getText().toString().length());
                }

                //setting the cursor back to where it was
                editText.setSelection(editText.getText().toString().length() - cursorPosition);
                editText.addTextChangedListener(this);
            } catch (Exception ex) {
                ex.printStackTrace();
                editText.addTextChangedListener(this);
            }
        }

        private static String getDecimalFormattedString(String value) {

            String[] splitValue = value.split("\\.");
            String beforeDecimal = value;
            String afterDecimal = null;
            String finalResult = "";

            if (splitValue.length == 2) {
                beforeDecimal = splitValue[0];
                afterDecimal = splitValue[1];
            }

            int count = 0;
            for (int i = beforeDecimal.length() - 1; i >= 0 ; i--) {
                finalResult = beforeDecimal.charAt(i) + finalResult;
                count++;
                if (count == 3 && i > 0) {
                    finalResult = thousandSeparator + finalResult;
                    count = 0;
                }
            }

            if (afterDecimal != null) {
                finalResult = finalResult + decimalMarker + afterDecimal;
            }

            return finalResult;
        }

        /*
        * Returns the string after removing all the thousands separators.
        * */
        public static String getOriginalString(String string) {
            return string.replace(thousandSeparator,"");
        }
    }
这不适用于浮点输入。注意不要在TextWatcher中设置无限循环

public void afterTextChanged(Editable view) {
    String s = null;
    try {
        // The comma in the format specifier does the trick
        s = String.format("%,d", Long.parseLong(view.toString()));
    } catch (NumberFormatException e) {
    }
    // Set s back to the view after temporarily removing the text change listener
}
    import android.text.Editable;
    import android.text.TextWatcher;
    import android.widget.EditText;

    import java.text.DecimalFormat;


    /**
     * Created by srv_twry on 4/12/17.
     * Source: https://stackoverflow.com/a/34265406/137744
     * The custom TextWatcher that automatically adds thousand separators in EditText.
     */

    public class ThousandSeparatorTextWatcher implements TextWatcher {

        private DecimalFormat df;
        private EditText editText;
        private static String thousandSeparator;
        private static String decimalMarker;
        private int cursorPosition;

        public ThousandSeparatorTextWatcher(EditText editText) {
            this.editText = editText;
            df = new DecimalFormat("#,###.##");
            df.setDecimalSeparatorAlwaysShown(true);
            thousandSeparator = Character.toString(df.getDecimalFormatSymbols().getGroupingSeparator());
            decimalMarker = Character.toString(df.getDecimalFormatSymbols().getDecimalSeparator());
        }

        @Override
        public void beforeTextChanged(CharSequence charSequence, int start, int count, int after) {
            cursorPosition = editText.getText().toString().length() - editText.getSelectionStart();
        }

        @Override
        public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {}

        @Override
        public void afterTextChanged(Editable s) {
            try {
                editText.removeTextChangedListener(this);
                String value = editText.getText().toString();

                if (value != null && !value.equals("")) {
                    if (value.startsWith(decimalMarker)) {
                        String text = "0" + decimalMarker;
                        editText.setText(text);
                    }
                    if (value.startsWith("0") && !value.startsWith("0" + decimalMarker)) {
                        int index = 0;
                        while (index < value.length() && value.charAt(index) == '0') {
                            index++;
                        }
                        String newValue = Character.toString(value.charAt(0));
                        if (index != 0) {
                            newValue = value.charAt(0) + value.substring(index);
                        }
                        editText.setText(newValue);
                    }
                    String str = editText.getText().toString().replaceAll(thousandSeparator, "");
                    if (!value.equals("")) {
                        editText.setText(getDecimalFormattedString(str));
                    }
                    editText.setSelection(editText.getText().toString().length());
                }

                //setting the cursor back to where it was
                editText.setSelection(editText.getText().toString().length() - cursorPosition);
                editText.addTextChangedListener(this);
            } catch (Exception ex) {
                ex.printStackTrace();
                editText.addTextChangedListener(this);
            }
        }

        private static String getDecimalFormattedString(String value) {

            String[] splitValue = value.split("\\.");
            String beforeDecimal = value;
            String afterDecimal = null;
            String finalResult = "";

            if (splitValue.length == 2) {
                beforeDecimal = splitValue[0];
                afterDecimal = splitValue[1];
            }

            int count = 0;
            for (int i = beforeDecimal.length() - 1; i >= 0 ; i--) {
                finalResult = beforeDecimal.charAt(i) + finalResult;
                count++;
                if (count == 3 && i > 0) {
                    finalResult = thousandSeparator + finalResult;
                    count = 0;
                }
            }

            if (afterDecimal != null) {
                finalResult = finalResult + decimalMarker + afterDecimal;
            }

            return finalResult;
        }

        /*
        * Returns the string after removing all the thousands separators.
        * */
        public static String getOriginalString(String string) {
            return string.replace(thousandSeparator,"");
        }
    }

因为我有同样的问题,我决定找到解决办法

    import android.text.Editable;
    import android.text.TextWatcher;
    import android.widget.EditText;

    import java.text.DecimalFormat;


    /**
     * Created by srv_twry on 4/12/17.
     * Source: https://stackoverflow.com/a/34265406/137744
     * The custom TextWatcher that automatically adds thousand separators in EditText.
     */

    public class ThousandSeparatorTextWatcher implements TextWatcher {

        private DecimalFormat df;
        private EditText editText;
        private static String thousandSeparator;
        private static String decimalMarker;
        private int cursorPosition;

        public ThousandSeparatorTextWatcher(EditText editText) {
            this.editText = editText;
            df = new DecimalFormat("#,###.##");
            df.setDecimalSeparatorAlwaysShown(true);
            thousandSeparator = Character.toString(df.getDecimalFormatSymbols().getGroupingSeparator());
            decimalMarker = Character.toString(df.getDecimalFormatSymbols().getDecimalSeparator());
        }

        @Override
        public void beforeTextChanged(CharSequence charSequence, int start, int count, int after) {
            cursorPosition = editText.getText().toString().length() - editText.getSelectionStart();
        }

        @Override
        public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {}

        @Override
        public void afterTextChanged(Editable s) {
            try {
                editText.removeTextChangedListener(this);
                String value = editText.getText().toString();

                if (value != null && !value.equals("")) {
                    if (value.startsWith(decimalMarker)) {
                        String text = "0" + decimalMarker;
                        editText.setText(text);
                    }
                    if (value.startsWith("0") && !value.startsWith("0" + decimalMarker)) {
                        int index = 0;
                        while (index < value.length() && value.charAt(index) == '0') {
                            index++;
                        }
                        String newValue = Character.toString(value.charAt(0));
                        if (index != 0) {
                            newValue = value.charAt(0) + value.substring(index);
                        }
                        editText.setText(newValue);
                    }
                    String str = editText.getText().toString().replaceAll(thousandSeparator, "");
                    if (!value.equals("")) {
                        editText.setText(getDecimalFormattedString(str));
                    }
                    editText.setSelection(editText.getText().toString().length());
                }

                //setting the cursor back to where it was
                editText.setSelection(editText.getText().toString().length() - cursorPosition);
                editText.addTextChangedListener(this);
            } catch (Exception ex) {
                ex.printStackTrace();
                editText.addTextChangedListener(this);
            }
        }

        private static String getDecimalFormattedString(String value) {

            String[] splitValue = value.split("\\.");
            String beforeDecimal = value;
            String afterDecimal = null;
            String finalResult = "";

            if (splitValue.length == 2) {
                beforeDecimal = splitValue[0];
                afterDecimal = splitValue[1];
            }

            int count = 0;
            for (int i = beforeDecimal.length() - 1; i >= 0 ; i--) {
                finalResult = beforeDecimal.charAt(i) + finalResult;
                count++;
                if (count == 3 && i > 0) {
                    finalResult = thousandSeparator + finalResult;
                    count = 0;
                }
            }

            if (afterDecimal != null) {
                finalResult = finalResult + decimalMarker + afterDecimal;
            }

            return finalResult;
        }

        /*
        * Returns the string after removing all the thousands separators.
        * */
        public static String getOriginalString(String string) {
            return string.replace(thousandSeparator,"");
        }
    }
在下面找到我的函数我希望它能帮助人们找到解决方案

securityDeposit.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 before, int count) {
                // TODO Auto-generated method stub

            }

            @Override
            public void afterTextChanged(Editable s) {
                // TODO Auto-generated method stub
                if (s.toString().trim().length() > 0) {
                    int rentValue = Integer.parseInt(s.toString()
                            .replaceAll(",", ""));
                    StringBuffer rentVal = new StringBuffer();
                    if (rentValue > 10000000) {
                        s.clear();
                        s.append("10,000,000");
                    } else {

                        if (s.length() == 4) {
                            char x[] = s.toString().toCharArray();

                            char y[] = new char[x.length + 1];
                            for (int z = 0; z < y.length; z++) {

                                if (z == 1) {
                                    y[1] = ',';

                                } else {
                                    if (z == 0)
                                        y[z] = x[z];
                                    else {
                                        y[z] = x[z - 1];
                                    }
                                }

                            }

                            for (int z = 0; z < y.length; z++) {
                                rentVal = rentVal.append(y[z]);
                            }

                            s.clear();
                            s.append(rentVal);

                        }

                    }
                }

            }
        });
    import android.text.Editable;
    import android.text.TextWatcher;
    import android.widget.EditText;

    import java.text.DecimalFormat;


    /**
     * Created by srv_twry on 4/12/17.
     * Source: https://stackoverflow.com/a/34265406/137744
     * The custom TextWatcher that automatically adds thousand separators in EditText.
     */

    public class ThousandSeparatorTextWatcher implements TextWatcher {

        private DecimalFormat df;
        private EditText editText;
        private static String thousandSeparator;
        private static String decimalMarker;
        private int cursorPosition;

        public ThousandSeparatorTextWatcher(EditText editText) {
            this.editText = editText;
            df = new DecimalFormat("#,###.##");
            df.setDecimalSeparatorAlwaysShown(true);
            thousandSeparator = Character.toString(df.getDecimalFormatSymbols().getGroupingSeparator());
            decimalMarker = Character.toString(df.getDecimalFormatSymbols().getDecimalSeparator());
        }

        @Override
        public void beforeTextChanged(CharSequence charSequence, int start, int count, int after) {
            cursorPosition = editText.getText().toString().length() - editText.getSelectionStart();
        }

        @Override
        public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {}

        @Override
        public void afterTextChanged(Editable s) {
            try {
                editText.removeTextChangedListener(this);
                String value = editText.getText().toString();

                if (value != null && !value.equals("")) {
                    if (value.startsWith(decimalMarker)) {
                        String text = "0" + decimalMarker;
                        editText.setText(text);
                    }
                    if (value.startsWith("0") && !value.startsWith("0" + decimalMarker)) {
                        int index = 0;
                        while (index < value.length() && value.charAt(index) == '0') {
                            index++;
                        }
                        String newValue = Character.toString(value.charAt(0));
                        if (index != 0) {
                            newValue = value.charAt(0) + value.substring(index);
                        }
                        editText.setText(newValue);
                    }
                    String str = editText.getText().toString().replaceAll(thousandSeparator, "");
                    if (!value.equals("")) {
                        editText.setText(getDecimalFormattedString(str));
                    }
                    editText.setSelection(editText.getText().toString().length());
                }

                //setting the cursor back to where it was
                editText.setSelection(editText.getText().toString().length() - cursorPosition);
                editText.addTextChangedListener(this);
            } catch (Exception ex) {
                ex.printStackTrace();
                editText.addTextChangedListener(this);
            }
        }

        private static String getDecimalFormattedString(String value) {

            String[] splitValue = value.split("\\.");
            String beforeDecimal = value;
            String afterDecimal = null;
            String finalResult = "";

            if (splitValue.length == 2) {
                beforeDecimal = splitValue[0];
                afterDecimal = splitValue[1];
            }

            int count = 0;
            for (int i = beforeDecimal.length() - 1; i >= 0 ; i--) {
                finalResult = beforeDecimal.charAt(i) + finalResult;
                count++;
                if (count == 3 && i > 0) {
                    finalResult = thousandSeparator + finalResult;
                    count = 0;
                }
            }

            if (afterDecimal != null) {
                finalResult = finalResult + decimalMarker + afterDecimal;
            }

            return finalResult;
        }

        /*
        * Returns the string after removing all the thousands separators.
        * */
        public static String getOriginalString(String string) {
            return string.replace(thousandSeparator,"");
        }
    }
securityDeposit.addTextChangedListener(新的TextWatcher(){
@凌驾
public void onTextChanged(字符序列,int start,
前整数,整数计数){
//TODO自动生成的方法存根
}
@凌驾
更改前的公共无效(字符序列、整数开始、,
前整数,整数计数){
//TODO自动生成的方法存根
}
@凌驾
公共无效后文本已更改(可编辑){
//TODO自动生成的方法存根
如果(s.toString().trim().length()>0){
int rentValue=Integer.parseInt(s.toString()
.replaceAll(“,”,“);
StringBuffer rentVal=新的StringBuffer();
如果(租金值>10000000){
s、 清除();
s、 追加(“10000000”);
}否则{
如果(s.长度()==4){
char x[]=s.toString().tocharray();
字符y[]=新字符[x.length+1];
对于(intz=0;z
公共静态字符串doubleToStringNoDecimal(双d){
DecimalFormat格式化程序=(DecimalFormat)NumberFormat.getInstance(Locale.US);
formatter.applyPattern(“#,#,###”);
返回格式化程序。格式(d);
}

终于解决了这个问题

    import android.text.Editable;
    import android.text.TextWatcher;
    import android.widget.EditText;

    import java.text.DecimalFormat;


    /**
     * Created by srv_twry on 4/12/17.
     * Source: https://stackoverflow.com/a/34265406/137744
     * The custom TextWatcher that automatically adds thousand separators in EditText.
     */

    public class ThousandSeparatorTextWatcher implements TextWatcher {

        private DecimalFormat df;
        private EditText editText;
        private static String thousandSeparator;
        private static String decimalMarker;
        private int cursorPosition;

        public ThousandSeparatorTextWatcher(EditText editText) {
            this.editText = editText;
            df = new DecimalFormat("#,###.##");
            df.setDecimalSeparatorAlwaysShown(true);
            thousandSeparator = Character.toString(df.getDecimalFormatSymbols().getGroupingSeparator());
            decimalMarker = Character.toString(df.getDecimalFormatSymbols().getDecimalSeparator());
        }

        @Override
        public void beforeTextChanged(CharSequence charSequence, int start, int count, int after) {
            cursorPosition = editText.getText().toString().length() - editText.getSelectionStart();
        }

        @Override
        public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {}

        @Override
        public void afterTextChanged(Editable s) {
            try {
                editText.removeTextChangedListener(this);
                String value = editText.getText().toString();

                if (value != null && !value.equals("")) {
                    if (value.startsWith(decimalMarker)) {
                        String text = "0" + decimalMarker;
                        editText.setText(text);
                    }
                    if (value.startsWith("0") && !value.startsWith("0" + decimalMarker)) {
                        int index = 0;
                        while (index < value.length() && value.charAt(index) == '0') {
                            index++;
                        }
                        String newValue = Character.toString(value.charAt(0));
                        if (index != 0) {
                            newValue = value.charAt(0) + value.substring(index);
                        }
                        editText.setText(newValue);
                    }
                    String str = editText.getText().toString().replaceAll(thousandSeparator, "");
                    if (!value.equals("")) {
                        editText.setText(getDecimalFormattedString(str));
                    }
                    editText.setSelection(editText.getText().toString().length());
                }

                //setting the cursor back to where it was
                editText.setSelection(editText.getText().toString().length() - cursorPosition);
                editText.addTextChangedListener(this);
            } catch (Exception ex) {
                ex.printStackTrace();
                editText.addTextChangedListener(this);
            }
        }

        private static String getDecimalFormattedString(String value) {

            String[] splitValue = value.split("\\.");
            String beforeDecimal = value;
            String afterDecimal = null;
            String finalResult = "";

            if (splitValue.length == 2) {
                beforeDecimal = splitValue[0];
                afterDecimal = splitValue[1];
            }

            int count = 0;
            for (int i = beforeDecimal.length() - 1; i >= 0 ; i--) {
                finalResult = beforeDecimal.charAt(i) + finalResult;
                count++;
                if (count == 3 && i > 0) {
                    finalResult = thousandSeparator + finalResult;
                    count = 0;
                }
            }

            if (afterDecimal != null) {
                finalResult = finalResult + decimalMarker + afterDecimal;
            }

            return finalResult;
        }

        /*
        * Returns the string after removing all the thousands separators.
        * */
        public static String getOriginalString(String string) {
            return string.replace(thousandSeparator,"");
        }
    }
即使现在回答已经太晚了。为了完成这项任务,我做了大量的研究,以获得正确的结果,但未能成功。因此,我最终解决了我们正在搜索的问题,并向谷歌搜索者提供了这个答案,以节省他们的搜索时间

    import android.text.Editable;
    import android.text.TextWatcher;
    import android.widget.EditText;

    import java.text.DecimalFormat;


    /**
     * Created by srv_twry on 4/12/17.
     * Source: https://stackoverflow.com/a/34265406/137744
     * The custom TextWatcher that automatically adds thousand separators in EditText.
     */

    public class ThousandSeparatorTextWatcher implements TextWatcher {

        private DecimalFormat df;
        private EditText editText;
        private static String thousandSeparator;
        private static String decimalMarker;
        private int cursorPosition;

        public ThousandSeparatorTextWatcher(EditText editText) {
            this.editText = editText;
            df = new DecimalFormat("#,###.##");
            df.setDecimalSeparatorAlwaysShown(true);
            thousandSeparator = Character.toString(df.getDecimalFormatSymbols().getGroupingSeparator());
            decimalMarker = Character.toString(df.getDecimalFormatSymbols().getDecimalSeparator());
        }

        @Override
        public void beforeTextChanged(CharSequence charSequence, int start, int count, int after) {
            cursorPosition = editText.getText().toString().length() - editText.getSelectionStart();
        }

        @Override
        public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {}

        @Override
        public void afterTextChanged(Editable s) {
            try {
                editText.removeTextChangedListener(this);
                String value = editText.getText().toString();

                if (value != null && !value.equals("")) {
                    if (value.startsWith(decimalMarker)) {
                        String text = "0" + decimalMarker;
                        editText.setText(text);
                    }
                    if (value.startsWith("0") && !value.startsWith("0" + decimalMarker)) {
                        int index = 0;
                        while (index < value.length() && value.charAt(index) == '0') {
                            index++;
                        }
                        String newValue = Character.toString(value.charAt(0));
                        if (index != 0) {
                            newValue = value.charAt(0) + value.substring(index);
                        }
                        editText.setText(newValue);
                    }
                    String str = editText.getText().toString().replaceAll(thousandSeparator, "");
                    if (!value.equals("")) {
                        editText.setText(getDecimalFormattedString(str));
                    }
                    editText.setSelection(editText.getText().toString().length());
                }

                //setting the cursor back to where it was
                editText.setSelection(editText.getText().toString().length() - cursorPosition);
                editText.addTextChangedListener(this);
            } catch (Exception ex) {
                ex.printStackTrace();
                editText.addTextChangedListener(this);
            }
        }

        private static String getDecimalFormattedString(String value) {

            String[] splitValue = value.split("\\.");
            String beforeDecimal = value;
            String afterDecimal = null;
            String finalResult = "";

            if (splitValue.length == 2) {
                beforeDecimal = splitValue[0];
                afterDecimal = splitValue[1];
            }

            int count = 0;
            for (int i = beforeDecimal.length() - 1; i >= 0 ; i--) {
                finalResult = beforeDecimal.charAt(i) + finalResult;
                count++;
                if (count == 3 && i > 0) {
                    finalResult = thousandSeparator + finalResult;
                    count = 0;
                }
            }

            if (afterDecimal != null) {
                finalResult = finalResult + decimalMarker + afterDecimal;
            }

            return finalResult;
        }

        /*
        * Returns the string after removing all the thousands separators.
        * */
        public static String getOriginalString(String string) {
            return string.replace(thousandSeparator,"");
        }
    }
以下代码的特征

    import android.text.Editable;
    import android.text.TextWatcher;
    import android.widget.EditText;

    import java.text.DecimalFormat;


    /**
     * Created by srv_twry on 4/12/17.
     * Source: https://stackoverflow.com/a/34265406/137744
     * The custom TextWatcher that automatically adds thousand separators in EditText.
     */

    public class ThousandSeparatorTextWatcher implements TextWatcher {

        private DecimalFormat df;
        private EditText editText;
        private static String thousandSeparator;
        private static String decimalMarker;
        private int cursorPosition;

        public ThousandSeparatorTextWatcher(EditText editText) {
            this.editText = editText;
            df = new DecimalFormat("#,###.##");
            df.setDecimalSeparatorAlwaysShown(true);
            thousandSeparator = Character.toString(df.getDecimalFormatSymbols().getGroupingSeparator());
            decimalMarker = Character.toString(df.getDecimalFormatSymbols().getDecimalSeparator());
        }

        @Override
        public void beforeTextChanged(CharSequence charSequence, int start, int count, int after) {
            cursorPosition = editText.getText().toString().length() - editText.getSelectionStart();
        }

        @Override
        public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {}

        @Override
        public void afterTextChanged(Editable s) {
            try {
                editText.removeTextChangedListener(this);
                String value = editText.getText().toString();

                if (value != null && !value.equals("")) {
                    if (value.startsWith(decimalMarker)) {
                        String text = "0" + decimalMarker;
                        editText.setText(text);
                    }
                    if (value.startsWith("0") && !value.startsWith("0" + decimalMarker)) {
                        int index = 0;
                        while (index < value.length() && value.charAt(index) == '0') {
                            index++;
                        }
                        String newValue = Character.toString(value.charAt(0));
                        if (index != 0) {
                            newValue = value.charAt(0) + value.substring(index);
                        }
                        editText.setText(newValue);
                    }
                    String str = editText.getText().toString().replaceAll(thousandSeparator, "");
                    if (!value.equals("")) {
                        editText.setText(getDecimalFormattedString(str));
                    }
                    editText.setSelection(editText.getText().toString().length());
                }

                //setting the cursor back to where it was
                editText.setSelection(editText.getText().toString().length() - cursorPosition);
                editText.addTextChangedListener(this);
            } catch (Exception ex) {
                ex.printStackTrace();
                editText.addTextChangedListener(this);
            }
        }

        private static String getDecimalFormattedString(String value) {

            String[] splitValue = value.split("\\.");
            String beforeDecimal = value;
            String afterDecimal = null;
            String finalResult = "";

            if (splitValue.length == 2) {
                beforeDecimal = splitValue[0];
                afterDecimal = splitValue[1];
            }

            int count = 0;
            for (int i = beforeDecimal.length() - 1; i >= 0 ; i--) {
                finalResult = beforeDecimal.charAt(i) + finalResult;
                count++;
                if (count == 3 && i > 0) {
                    finalResult = thousandSeparator + finalResult;
                    count = 0;
                }
            }

            if (afterDecimal != null) {
                finalResult = finalResult + decimalMarker + afterDecimal;
            }

            return finalResult;
        }

        /*
        * Returns the string after removing all the thousands separators.
        * */
        public static String getOriginalString(String string) {
            return string.replace(thousandSeparator,"");
        }
    }
  • 当文本更改时,在
    EditText
    中放置千位分隔符

  •     import android.text.Editable;
        import android.text.TextWatcher;
        import android.widget.EditText;
    
        import java.text.DecimalFormat;
    
    
        /**
         * Created by srv_twry on 4/12/17.
         * Source: https://stackoverflow.com/a/34265406/137744
         * The custom TextWatcher that automatically adds thousand separators in EditText.
         */
    
        public class ThousandSeparatorTextWatcher implements TextWatcher {
    
            private DecimalFormat df;
            private EditText editText;
            private static String thousandSeparator;
            private static String decimalMarker;
            private int cursorPosition;
    
            public ThousandSeparatorTextWatcher(EditText editText) {
                this.editText = editText;
                df = new DecimalFormat("#,###.##");
                df.setDecimalSeparatorAlwaysShown(true);
                thousandSeparator = Character.toString(df.getDecimalFormatSymbols().getGroupingSeparator());
                decimalMarker = Character.toString(df.getDecimalFormatSymbols().getDecimalSeparator());
            }
    
            @Override
            public void beforeTextChanged(CharSequence charSequence, int start, int count, int after) {
                cursorPosition = editText.getText().toString().length() - editText.getSelectionStart();
            }
    
            @Override
            public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {}
    
            @Override
            public void afterTextChanged(Editable s) {
                try {
                    editText.removeTextChangedListener(this);
                    String value = editText.getText().toString();
    
                    if (value != null && !value.equals("")) {
                        if (value.startsWith(decimalMarker)) {
                            String text = "0" + decimalMarker;
                            editText.setText(text);
                        }
                        if (value.startsWith("0") && !value.startsWith("0" + decimalMarker)) {
                            int index = 0;
                            while (index < value.length() && value.charAt(index) == '0') {
                                index++;
                            }
                            String newValue = Character.toString(value.charAt(0));
                            if (index != 0) {
                                newValue = value.charAt(0) + value.substring(index);
                            }
                            editText.setText(newValue);
                        }
                        String str = editText.getText().toString().replaceAll(thousandSeparator, "");
                        if (!value.equals("")) {
                            editText.setText(getDecimalFormattedString(str));
                        }
                        editText.setSelection(editText.getText().toString().length());
                    }
    
                    //setting the cursor back to where it was
                    editText.setSelection(editText.getText().toString().length() - cursorPosition);
                    editText.addTextChangedListener(this);
                } catch (Exception ex) {
                    ex.printStackTrace();
                    editText.addTextChangedListener(this);
                }
            }
    
            private static String getDecimalFormattedString(String value) {
    
                String[] splitValue = value.split("\\.");
                String beforeDecimal = value;
                String afterDecimal = null;
                String finalResult = "";
    
                if (splitValue.length == 2) {
                    beforeDecimal = splitValue[0];
                    afterDecimal = splitValue[1];
                }
    
                int count = 0;
                for (int i = beforeDecimal.length() - 1; i >= 0 ; i--) {
                    finalResult = beforeDecimal.charAt(i) + finalResult;
                    count++;
                    if (count == 3 && i > 0) {
                        finalResult = thousandSeparator + finalResult;
                        count = 0;
                    }
                }
    
                if (afterDecimal != null) {
                    finalResult = finalResult + decimalMarker + afterDecimal;
                }
    
                return finalResult;
            }
    
            /*
            * Returns the string after removing all the thousands separators.
            * */
            public static String getOriginalString(String string) {
                return string.replace(thousandSeparator,"");
            }
        }
    
  • 首次按下句点(.)时自动添加
    0.

  •     import android.text.Editable;
        import android.text.TextWatcher;
        import android.widget.EditText;
    
        import java.text.DecimalFormat;
    
    
        /**
         * Created by srv_twry on 4/12/17.
         * Source: https://stackoverflow.com/a/34265406/137744
         * The custom TextWatcher that automatically adds thousand separators in EditText.
         */
    
        public class ThousandSeparatorTextWatcher implements TextWatcher {
    
            private DecimalFormat df;
            private EditText editText;
            private static String thousandSeparator;
            private static String decimalMarker;
            private int cursorPosition;
    
            public ThousandSeparatorTextWatcher(EditText editText) {
                this.editText = editText;
                df = new DecimalFormat("#,###.##");
                df.setDecimalSeparatorAlwaysShown(true);
                thousandSeparator = Character.toString(df.getDecimalFormatSymbols().getGroupingSeparator());
                decimalMarker = Character.toString(df.getDecimalFormatSymbols().getDecimalSeparator());
            }
    
            @Override
            public void beforeTextChanged(CharSequence charSequence, int start, int count, int after) {
                cursorPosition = editText.getText().toString().length() - editText.getSelectionStart();
            }
    
            @Override
            public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {}
    
            @Override
            public void afterTextChanged(Editable s) {
                try {
                    editText.removeTextChangedListener(this);
                    String value = editText.getText().toString();
    
                    if (value != null && !value.equals("")) {
                        if (value.startsWith(decimalMarker)) {
                            String text = "0" + decimalMarker;
                            editText.setText(text);
                        }
                        if (value.startsWith("0") && !value.startsWith("0" + decimalMarker)) {
                            int index = 0;
                            while (index < value.length() && value.charAt(index) == '0') {
                                index++;
                            }
                            String newValue = Character.toString(value.charAt(0));
                            if (index != 0) {
                                newValue = value.charAt(0) + value.substring(index);
                            }
                            editText.setText(newValue);
                        }
                        String str = editText.getText().toString().replaceAll(thousandSeparator, "");
                        if (!value.equals("")) {
                            editText.setText(getDecimalFormattedString(str));
                        }
                        editText.setSelection(editText.getText().toString().length());
                    }
    
                    //setting the cursor back to where it was
                    editText.setSelection(editText.getText().toString().length() - cursorPosition);
                    editText.addTextChangedListener(this);
                } catch (Exception ex) {
                    ex.printStackTrace();
                    editText.addTextChangedListener(this);
                }
            }
    
            private static String getDecimalFormattedString(String value) {
    
                String[] splitValue = value.split("\\.");
                String beforeDecimal = value;
                String afterDecimal = null;
                String finalResult = "";
    
                if (splitValue.length == 2) {
                    beforeDecimal = splitValue[0];
                    afterDecimal = splitValue[1];
                }
    
                int count = 0;
                for (int i = beforeDecimal.length() - 1; i >= 0 ; i--) {
                    finalResult = beforeDecimal.charAt(i) + finalResult;
                    count++;
                    if (count == 3 && i > 0) {
                        finalResult = thousandSeparator + finalResult;
                        count = 0;
                    }
                }
    
                if (afterDecimal != null) {
                    finalResult = finalResult + decimalMarker + afterDecimal;
                }
    
                return finalResult;
            }
    
            /*
            * Returns the string after removing all the thousands separators.
            * */
            public static String getOriginalString(String string) {
                return string.replace(thousandSeparator,"");
            }
        }
    
  • 忽略开头的
    0
    输入

  •     import android.text.Editable;
        import android.text.TextWatcher;
        import android.widget.EditText;
    
        import java.text.DecimalFormat;
    
    
        /**
         * Created by srv_twry on 4/12/17.
         * Source: https://stackoverflow.com/a/34265406/137744
         * The custom TextWatcher that automatically adds thousand separators in EditText.
         */
    
        public class ThousandSeparatorTextWatcher implements TextWatcher {
    
            private DecimalFormat df;
            private EditText editText;
            private static String thousandSeparator;
            private static String decimalMarker;
            private int cursorPosition;
    
            public ThousandSeparatorTextWatcher(EditText editText) {
                this.editText = editText;
                df = new DecimalFormat("#,###.##");
                df.setDecimalSeparatorAlwaysShown(true);
                thousandSeparator = Character.toString(df.getDecimalFormatSymbols().getGroupingSeparator());
                decimalMarker = Character.toString(df.getDecimalFormatSymbols().getDecimalSeparator());
            }
    
            @Override
            public void beforeTextChanged(CharSequence charSequence, int start, int count, int after) {
                cursorPosition = editText.getText().toString().length() - editText.getSelectionStart();
            }
    
            @Override
            public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {}
    
            @Override
            public void afterTextChanged(Editable s) {
                try {
                    editText.removeTextChangedListener(this);
                    String value = editText.getText().toString();
    
                    if (value != null && !value.equals("")) {
                        if (value.startsWith(decimalMarker)) {
                            String text = "0" + decimalMarker;
                            editText.setText(text);
                        }
                        if (value.startsWith("0") && !value.startsWith("0" + decimalMarker)) {
                            int index = 0;
                            while (index < value.length() && value.charAt(index) == '0') {
                                index++;
                            }
                            String newValue = Character.toString(value.charAt(0));
                            if (index != 0) {
                                newValue = value.charAt(0) + value.substring(index);
                            }
                            editText.setText(newValue);
                        }
                        String str = editText.getText().toString().replaceAll(thousandSeparator, "");
                        if (!value.equals("")) {
                            editText.setText(getDecimalFormattedString(str));
                        }
                        editText.setSelection(editText.getText().toString().length());
                    }
    
                    //setting the cursor back to where it was
                    editText.setSelection(editText.getText().toString().length() - cursorPosition);
                    editText.addTextChangedListener(this);
                } catch (Exception ex) {
                    ex.printStackTrace();
                    editText.addTextChangedListener(this);
                }
            }
    
            private static String getDecimalFormattedString(String value) {
    
                String[] splitValue = value.split("\\.");
                String beforeDecimal = value;
                String afterDecimal = null;
                String finalResult = "";
    
                if (splitValue.length == 2) {
                    beforeDecimal = splitValue[0];
                    afterDecimal = splitValue[1];
                }
    
                int count = 0;
                for (int i = beforeDecimal.length() - 1; i >= 0 ; i--) {
                    finalResult = beforeDecimal.charAt(i) + finalResult;
                    count++;
                    if (count == 3 && i > 0) {
                        finalResult = thousandSeparator + finalResult;
                        count = 0;
                    }
                }
    
                if (afterDecimal != null) {
                    finalResult = finalResult + decimalMarker + afterDecimal;
                }
    
                return finalResult;
            }
    
            /*
            * Returns the string after removing all the thousands separators.
            * */
            public static String getOriginalString(String string) {
                return string.replace(thousandSeparator,"");
            }
        }
    
    只需复制以下内容 名为

        import android.text.Editable;
        import android.text.TextWatcher;
        import android.widget.EditText;
    
        import java.text.DecimalFormat;
    
    
        /**
         * Created by srv_twry on 4/12/17.
         * Source: https://stackoverflow.com/a/34265406/137744
         * The custom TextWatcher that automatically adds thousand separators in EditText.
         */
    
        public class ThousandSeparatorTextWatcher implements TextWatcher {
    
            private DecimalFormat df;
            private EditText editText;
            private static String thousandSeparator;
            private static String decimalMarker;
            private int cursorPosition;
    
            public ThousandSeparatorTextWatcher(EditText editText) {
                this.editText = editText;
                df = new DecimalFormat("#,###.##");
                df.setDecimalSeparatorAlwaysShown(true);
                thousandSeparator = Character.toString(df.getDecimalFormatSymbols().getGroupingSeparator());
                decimalMarker = Character.toString(df.getDecimalFormatSymbols().getDecimalSeparator());
            }
    
            @Override
            public void beforeTextChanged(CharSequence charSequence, int start, int count, int after) {
                cursorPosition = editText.getText().toString().length() - editText.getSelectionStart();
            }
    
            @Override
            public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {}
    
            @Override
            public void afterTextChanged(Editable s) {
                try {
                    editText.removeTextChangedListener(this);
                    String value = editText.getText().toString();
    
                    if (value != null && !value.equals("")) {
                        if (value.startsWith(decimalMarker)) {
                            String text = "0" + decimalMarker;
                            editText.setText(text);
                        }
                        if (value.startsWith("0") && !value.startsWith("0" + decimalMarker)) {
                            int index = 0;
                            while (index < value.length() && value.charAt(index) == '0') {
                                index++;
                            }
                            String newValue = Character.toString(value.charAt(0));
                            if (index != 0) {
                                newValue = value.charAt(0) + value.substring(index);
                            }
                            editText.setText(newValue);
                        }
                        String str = editText.getText().toString().replaceAll(thousandSeparator, "");
                        if (!value.equals("")) {
                            editText.setText(getDecimalFormattedString(str));
                        }
                        editText.setSelection(editText.getText().toString().length());
                    }
    
                    //setting the cursor back to where it was
                    editText.setSelection(editText.getText().toString().length() - cursorPosition);
                    editText.addTextChangedListener(this);
                } catch (Exception ex) {
                    ex.printStackTrace();
                    editText.addTextChangedListener(this);
                }
            }
    
            private static String getDecimalFormattedString(String value) {
    
                String[] splitValue = value.split("\\.");
                String beforeDecimal = value;
                String afterDecimal = null;
                String finalResult = "";
    
                if (splitValue.length == 2) {
                    beforeDecimal = splitValue[0];
                    afterDecimal = splitValue[1];
                }
    
                int count = 0;
                for (int i = beforeDecimal.length() - 1; i >= 0 ; i--) {
                    finalResult = beforeDecimal.charAt(i) + finalResult;
                    count++;
                    if (count == 3 && i > 0) {
                        finalResult = thousandSeparator + finalResult;
                        count = 0;
                    }
                }
    
                if (afterDecimal != null) {
                    finalResult = finalResult + decimalMarker + afterDecimal;
                }
    
                return finalResult;
            }
    
            /*
            * Returns the string after removing all the thousands separators.
            * */
            public static String getOriginalString(String string) {
                return string.replace(thousandSeparator,"");
            }
        }
    
    numbertextWatcherOrthousand哪个实现TextWatcher

    import android.text.Editable;
    import android.text.TextWatcher;
    import android.widget.EditText;
    import java.util.StringTokenizer;
    
    /**
     * Created by skb on 12/14/2015.
     */
    public class NumberTextWatcherForThousand implements TextWatcher {
    
        EditText editText;
    
    
        public NumberTextWatcherForThousand(EditText editText) {
            this.editText = editText;
    
    
        }
    
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {
    
        }
    
        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
    
        }
    
        @Override
        public void afterTextChanged(Editable s) {
            try
            {
                editText.removeTextChangedListener(this);
                String value = editText.getText().toString();
    
    
                if (value != null && !value.equals(""))
                {
    
                    if(value.startsWith(".")){
                        editText.setText("0.");
                    }
                    if(value.startsWith("0") && !value.startsWith("0.")){
                        editText.setText("");
    
                    }
    
    
                    String str = editText.getText().toString().replaceAll(",", "");
                    if (!value.equals(""))
                    editText.setText(getDecimalFormattedString(str));
                    editText.setSelection(editText.getText().toString().length());
                }
                editText.addTextChangedListener(this);
                return;
            }
            catch (Exception ex)
            {
                ex.printStackTrace();
                editText.addTextChangedListener(this);
            }
    
        }
    
        public static String getDecimalFormattedString(String value)
        {
            StringTokenizer lst = new StringTokenizer(value, ".");
            String str1 = value;
            String str2 = "";
            if (lst.countTokens() > 1)
            {
                str1 = lst.nextToken();
                str2 = lst.nextToken();
            }
            String str3 = "";
            int i = 0;
            int j = -1 + str1.length();
            if (str1.charAt( -1 + str1.length()) == '.')
            {
                j--;
                str3 = ".";
            }
            for (int k = j;; k--)
            {
                if (k < 0)
                {
                    if (str2.length() > 0)
                        str3 = str3 + "." + str2;
                    return str3;
                }
                if (i == 3)
                {
                    str3 = "," + str3;
                    i = 0;
                }
                str3 = str1.charAt(k) + str3;
                i++;
            }
    
        }
    
        public static String trimCommaOfString(String string) {
    //        String returnString;
            if(string.contains(",")){
                return string.replace(",","");}
            else {
                return string;
            }
    
        }
    }
    
        import android.text.Editable;
        import android.text.TextWatcher;
        import android.widget.EditText;
    
        import java.text.DecimalFormat;
    
    
        /**
         * Created by srv_twry on 4/12/17.
         * Source: https://stackoverflow.com/a/34265406/137744
         * The custom TextWatcher that automatically adds thousand separators in EditText.
         */
    
        public class ThousandSeparatorTextWatcher implements TextWatcher {
    
            private DecimalFormat df;
            private EditText editText;
            private static String thousandSeparator;
            private static String decimalMarker;
            private int cursorPosition;
    
            public ThousandSeparatorTextWatcher(EditText editText) {
                this.editText = editText;
                df = new DecimalFormat("#,###.##");
                df.setDecimalSeparatorAlwaysShown(true);
                thousandSeparator = Character.toString(df.getDecimalFormatSymbols().getGroupingSeparator());
                decimalMarker = Character.toString(df.getDecimalFormatSymbols().getDecimalSeparator());
            }
    
            @Override
            public void beforeTextChanged(CharSequence charSequence, int start, int count, int after) {
                cursorPosition = editText.getText().toString().length() - editText.getSelectionStart();
            }
    
            @Override
            public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {}
    
            @Override
            public void afterTextChanged(Editable s) {
                try {
                    editText.removeTextChangedListener(this);
                    String value = editText.getText().toString();
    
                    if (value != null && !value.equals("")) {
                        if (value.startsWith(decimalMarker)) {
                            String text = "0" + decimalMarker;
                            editText.setText(text);
                        }
                        if (value.startsWith("0") && !value.startsWith("0" + decimalMarker)) {
                            int index = 0;
                            while (index < value.length() && value.charAt(index) == '0') {
                                index++;
                            }
                            String newValue = Character.toString(value.charAt(0));
                            if (index != 0) {
                                newValue = value.charAt(0) + value.substring(index);
                            }
                            editText.setText(newValue);
                        }
                        String str = editText.getText().toString().replaceAll(thousandSeparator, "");
                        if (!value.equals("")) {
                            editText.setText(getDecimalFormattedString(str));
                        }
                        editText.setSelection(editText.getText().toString().length());
                    }
    
                    //setting the cursor back to where it was
                    editText.setSelection(editText.getText().toString().length() - cursorPosition);
                    editText.addTextChangedListener(this);
                } catch (Exception ex) {
                    ex.printStackTrace();
                    editText.addTextChangedListener(this);
                }
            }
    
            private static String getDecimalFormattedString(String value) {
    
                String[] splitValue = value.split("\\.");
                String beforeDecimal = value;
                String afterDecimal = null;
                String finalResult = "";
    
                if (splitValue.length == 2) {
                    beforeDecimal = splitValue[0];
                    afterDecimal = splitValue[1];
                }
    
                int count = 0;
                for (int i = beforeDecimal.length() - 1; i >= 0 ; i--) {
                    finalResult = beforeDecimal.charAt(i) + finalResult;
                    count++;
                    if (count == 3 && i > 0) {
                        finalResult = thousandSeparator + finalResult;
                        count = 0;
                    }
                }
    
                if (afterDecimal != null) {
                    finalResult = finalResult + decimalMarker + afterDecimal;
                }
    
                return finalResult;
            }
    
            /*
            * Returns the string after removing all the thousands separators.
            * */
            public static String getOriginalString(String string) {
                return string.replace(thousandSeparator,"");
            }
        }
    
    以纯双文本形式获取输入

        import android.text.Editable;
        import android.text.TextWatcher;
        import android.widget.EditText;
    
        import java.text.DecimalFormat;
    
    
        /**
         * Created by srv_twry on 4/12/17.
         * Source: https://stackoverflow.com/a/34265406/137744
         * The custom TextWatcher that automatically adds thousand separators in EditText.
         */
    
        public class ThousandSeparatorTextWatcher implements TextWatcher {
    
            private DecimalFormat df;
            private EditText editText;
            private static String thousandSeparator;
            private static String decimalMarker;
            private int cursorPosition;
    
            public ThousandSeparatorTextWatcher(EditText editText) {
                this.editText = editText;
                df = new DecimalFormat("#,###.##");
                df.setDecimalSeparatorAlwaysShown(true);
                thousandSeparator = Character.toString(df.getDecimalFormatSymbols().getGroupingSeparator());
                decimalMarker = Character.toString(df.getDecimalFormatSymbols().getDecimalSeparator());
            }
    
            @Override
            public void beforeTextChanged(CharSequence charSequence, int start, int count, int after) {
                cursorPosition = editText.getText().toString().length() - editText.getSelectionStart();
            }
    
            @Override
            public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {}
    
            @Override
            public void afterTextChanged(Editable s) {
                try {
                    editText.removeTextChangedListener(this);
                    String value = editText.getText().toString();
    
                    if (value != null && !value.equals("")) {
                        if (value.startsWith(decimalMarker)) {
                            String text = "0" + decimalMarker;
                            editText.setText(text);
                        }
                        if (value.startsWith("0") && !value.startsWith("0" + decimalMarker)) {
                            int index = 0;
                            while (index < value.length() && value.charAt(index) == '0') {
                                index++;
                            }
                            String newValue = Character.toString(value.charAt(0));
                            if (index != 0) {
                                newValue = value.charAt(0) + value.substring(index);
                            }
                            editText.setText(newValue);
                        }
                        String str = editText.getText().toString().replaceAll(thousandSeparator, "");
                        if (!value.equals("")) {
                            editText.setText(getDecimalFormattedString(str));
                        }
                        editText.setSelection(editText.getText().toString().length());
                    }
    
                    //setting the cursor back to where it was
                    editText.setSelection(editText.getText().toString().length() - cursorPosition);
                    editText.addTextChangedListener(this);
                } catch (Exception ex) {
                    ex.printStackTrace();
                    editText.addTextChangedListener(this);
                }
            }
    
            private static String getDecimalFormattedString(String value) {
    
                String[] splitValue = value.split("\\.");
                String beforeDecimal = value;
                String afterDecimal = null;
                String finalResult = "";
    
                if (splitValue.length == 2) {
                    beforeDecimal = splitValue[0];
                    afterDecimal = splitValue[1];
                }
    
                int count = 0;
                for (int i = beforeDecimal.length() - 1; i >= 0 ; i--) {
                    finalResult = beforeDecimal.charAt(i) + finalResult;
                    count++;
                    if (count == 3 && i > 0) {
                        finalResult = thousandSeparator + finalResult;
                        count = 0;
                    }
                }
    
                if (afterDecimal != null) {
                    finalResult = finalResult + decimalMarker + afterDecimal;
                }
    
                return finalResult;
            }
    
            /*
            * Returns the string after removing all the thousands separators.
            * */
            public static String getOriginalString(String string) {
                return string.replace(thousandSeparator,"");
            }
        }
    
    像这样使用同一类的
    trimCommaOfString
    方法

    NumberTextWatcherForThousand.trimCommaOfString(editText.getText().toString())
    
        import android.text.Editable;
        import android.text.TextWatcher;
        import android.widget.EditText;
    
        import java.text.DecimalFormat;
    
    
        /**
         * Created by srv_twry on 4/12/17.
         * Source: https://stackoverflow.com/a/34265406/137744
         * The custom TextWatcher that automatically adds thousand separators in EditText.
         */
    
        public class ThousandSeparatorTextWatcher implements TextWatcher {
    
            private DecimalFormat df;
            private EditText editText;
            private static String thousandSeparator;
            private static String decimalMarker;
            private int cursorPosition;
    
            public ThousandSeparatorTextWatcher(EditText editText) {
                this.editText = editText;
                df = new DecimalFormat("#,###.##");
                df.setDecimalSeparatorAlwaysShown(true);
                thousandSeparator = Character.toString(df.getDecimalFormatSymbols().getGroupingSeparator());
                decimalMarker = Character.toString(df.getDecimalFormatSymbols().getDecimalSeparator());
            }
    
            @Override
            public void beforeTextChanged(CharSequence charSequence, int start, int count, int after) {
                cursorPosition = editText.getText().toString().length() - editText.getSelectionStart();
            }
    
            @Override
            public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {}
    
            @Override
            public void afterTextChanged(Editable s) {
                try {
                    editText.removeTextChangedListener(this);
                    String value = editText.getText().toString();
    
                    if (value != null && !value.equals("")) {
                        if (value.startsWith(decimalMarker)) {
                            String text = "0" + decimalMarker;
                            editText.setText(text);
                        }
                        if (value.startsWith("0") && !value.startsWith("0" + decimalMarker)) {
                            int index = 0;
                            while (index < value.length() && value.charAt(index) == '0') {
                                index++;
                            }
                            String newValue = Character.toString(value.charAt(0));
                            if (index != 0) {
                                newValue = value.charAt(0) + value.substring(index);
                            }
                            editText.setText(newValue);
                        }
                        String str = editText.getText().toString().replaceAll(thousandSeparator, "");
                        if (!value.equals("")) {
                            editText.setText(getDecimalFormattedString(str));
                        }
                        editText.setSelection(editText.getText().toString().length());
                    }
    
                    //setting the cursor back to where it was
                    editText.setSelection(editText.getText().toString().length() - cursorPosition);
                    editText.addTextChangedListener(this);
                } catch (Exception ex) {
                    ex.printStackTrace();
                    editText.addTextChangedListener(this);
                }
            }
    
            private static String getDecimalFormattedString(String value) {
    
                String[] splitValue = value.split("\\.");
                String beforeDecimal = value;
                String afterDecimal = null;
                String finalResult = "";
    
                if (splitValue.length == 2) {
                    beforeDecimal = splitValue[0];
                    afterDecimal = splitValue[1];
                }
    
                int count = 0;
                for (int i = beforeDecimal.length() - 1; i >= 0 ; i--) {
                    finalResult = beforeDecimal.charAt(i) + finalResult;
                    count++;
                    if (count == 3 && i > 0) {
                        finalResult = thousandSeparator + finalResult;
                        count = 0;
                    }
                }
    
                if (afterDecimal != null) {
                    finalResult = finalResult + decimalMarker + afterDecimal;
                }
    
                return finalResult;
            }
    
            /*
            * Returns the string after removing all the thousands separators.
            * */
            public static String getOriginalString(String string) {
                return string.replace(thousandSeparator,"");
            }
        }
    

    您可以在程序中以多种方式使用此代码,您给它一个字符串,它将三个代码从右侧分开,并在其中放置空格

    private String Spacer(String number){
        StringBuilder strB = new StringBuilder();
        strB.append(number);
        int Three = 0;
    
        for(int i=number.length();i>0;i--){
            Three++;
            if(Three == 3){
                strB.insert(i-1, " ");
                Three = 0;
            }
        }
        return strB.toString();
    }// end Spacer()
    
        import android.text.Editable;
        import android.text.TextWatcher;
        import android.widget.EditText;
    
        import java.text.DecimalFormat;
    
    
        /**
         * Created by srv_twry on 4/12/17.
         * Source: https://stackoverflow.com/a/34265406/137744
         * The custom TextWatcher that automatically adds thousand separators in EditText.
         */
    
        public class ThousandSeparatorTextWatcher implements TextWatcher {
    
            private DecimalFormat df;
            private EditText editText;
            private static String thousandSeparator;
            private static String decimalMarker;
            private int cursorPosition;
    
            public ThousandSeparatorTextWatcher(EditText editText) {
                this.editText = editText;
                df = new DecimalFormat("#,###.##");
                df.setDecimalSeparatorAlwaysShown(true);
                thousandSeparator = Character.toString(df.getDecimalFormatSymbols().getGroupingSeparator());
                decimalMarker = Character.toString(df.getDecimalFormatSymbols().getDecimalSeparator());
            }
    
            @Override
            public void beforeTextChanged(CharSequence charSequence, int start, int count, int after) {
                cursorPosition = editText.getText().toString().length() - editText.getSelectionStart();
            }
    
            @Override
            public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {}
    
            @Override
            public void afterTextChanged(Editable s) {
                try {
                    editText.removeTextChangedListener(this);
                    String value = editText.getText().toString();
    
                    if (value != null && !value.equals("")) {
                        if (value.startsWith(decimalMarker)) {
                            String text = "0" + decimalMarker;
                            editText.setText(text);
                        }
                        if (value.startsWith("0") && !value.startsWith("0" + decimalMarker)) {
                            int index = 0;
                            while (index < value.length() && value.charAt(index) == '0') {
                                index++;
                            }
                            String newValue = Character.toString(value.charAt(0));
                            if (index != 0) {
                                newValue = value.charAt(0) + value.substring(index);
                            }
                            editText.setText(newValue);
                        }
                        String str = editText.getText().toString().replaceAll(thousandSeparator, "");
                        if (!value.equals("")) {
                            editText.setText(getDecimalFormattedString(str));
                        }
                        editText.setSelection(editText.getText().toString().length());
                    }
    
                    //setting the cursor back to where it was
                    editText.setSelection(editText.getText().toString().length() - cursorPosition);
                    editText.addTextChangedListener(this);
                } catch (Exception ex) {
                    ex.printStackTrace();
                    editText.addTextChangedListener(this);
                }
            }
    
            private static String getDecimalFormattedString(String value) {
    
                String[] splitValue = value.split("\\.");
                String beforeDecimal = value;
                String afterDecimal = null;
                String finalResult = "";
    
                if (splitValue.length == 2) {
                    beforeDecimal = splitValue[0];
                    afterDecimal = splitValue[1];
                }
    
                int count = 0;
                for (int i = beforeDecimal.length() - 1; i >= 0 ; i--) {
                    finalResult = beforeDecimal.charAt(i) + finalResult;
                    count++;
                    if (count == 3 && i > 0) {
                        finalResult = thousandSeparator + finalResult;
                        count = 0;
                    }
                }
    
                if (afterDecimal != null) {
                    finalResult = finalResult + decimalMarker + afterDecimal;
                }
    
                return finalResult;
            }
    
            /*
            * Returns the string after removing all the thousands separators.
            * */
            public static String getOriginalString(String string) {
                return string.replace(thousandSeparator,"");
            }
        }
    
    您可以稍微更改它,并在ContextChangeListener上使用它。 祝你好运

    这将清晰地解构格式数字

        import android.text.Editable;
        import android.text.TextWatcher;
        import android.widget.EditText;
    
        import java.text.DecimalFormat;
    
    
        /**
         * Created by srv_twry on 4/12/17.
         * Source: https://stackoverflow.com/a/34265406/137744
         * The custom TextWatcher that automatically adds thousand separators in EditText.
         */
    
        public class ThousandSeparatorTextWatcher implements TextWatcher {
    
            private DecimalFormat df;
            private EditText editText;
            private static String thousandSeparator;
            private static String decimalMarker;
            private int cursorPosition;
    
            public ThousandSeparatorTextWatcher(EditText editText) {
                this.editText = editText;
                df = new DecimalFormat("#,###.##");
                df.setDecimalSeparatorAlwaysShown(true);
                thousandSeparator = Character.toString(df.getDecimalFormatSymbols().getGroupingSeparator());
                decimalMarker = Character.toString(df.getDecimalFormatSymbols().getDecimalSeparator());
            }
    
            @Override
            public void beforeTextChanged(CharSequence charSequence, int start, int count, int after) {
                cursorPosition = editText.getText().toString().length() - editText.getSelectionStart();
            }
    
            @Override
            public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {}
    
            @Override
            public void afterTextChanged(Editable s) {
                try {
                    editText.removeTextChangedListener(this);
                    String value = editText.getText().toString();
    
                    if (value != null && !value.equals("")) {
                        if (value.startsWith(decimalMarker)) {
                            String text = "0" + decimalMarker;
                            editText.setText(text);
                        }
                        if (value.startsWith("0") && !value.startsWith("0" + decimalMarker)) {
                            int index = 0;
                            while (index < value.length() && value.charAt(index) == '0') {
                                index++;
                            }
                            String newValue = Character.toString(value.charAt(0));
                            if (index != 0) {
                                newValue = value.charAt(0) + value.substring(index);
                            }
                            editText.setText(newValue);
                        }
                        String str = editText.getText().toString().replaceAll(thousandSeparator, "");
                        if (!value.equals("")) {
                            editText.setText(getDecimalFormattedString(str));
                        }
                        editText.setSelection(editText.getText().toString().length());
                    }
    
                    //setting the cursor back to where it was
                    editText.setSelection(editText.getText().toString().length() - cursorPosition);
                    editText.addTextChangedListener(this);
                } catch (Exception ex) {
                    ex.printStackTrace();
                    editText.addTextChangedListener(this);
                }
            }
    
            private static String getDecimalFormattedString(String value) {
    
                String[] splitValue = value.split("\\.");
                String beforeDecimal = value;
                String afterDecimal = null;
                String finalResult = "";
    
                if (splitValue.length == 2) {
                    beforeDecimal = splitValue[0];
                    afterDecimal = splitValue[1];
                }
    
                int count = 0;
                for (int i = beforeDecimal.length() - 1; i >= 0 ; i--) {
                    finalResult = beforeDecimal.charAt(i) + finalResult;
                    count++;
                    if (count == 3 && i > 0) {
                        finalResult = thousandSeparator + finalResult;
                        count = 0;
                    }
                }
    
                if (afterDecimal != null) {
                    finalResult = finalResult + decimalMarker + afterDecimal;
                }
    
                return finalResult;
            }
    
            /*
            * Returns the string after removing all the thousands separators.
            * */
            public static String getOriginalString(String string) {
                return string.replace(thousandSeparator,"");
            }
        }
    
    要总结上面的链接,请使用
    TextWatcher
    ,并在
    postTextChanged()
    方法中使用以下逻辑格式化
    EditText
    视图:

    @Override
    public void afterTextChanged(Editable s) {
        editText.removeTextChangedListener(this);
    
        try {
            String originalString = s.toString();
    
            Long longval;
            if (originalString.contains(",")) {
                originalString = originalString.replaceAll(",", "");
            }
            longval = Long.parseLong(originalString);
    
            DecimalFormat formatter = (DecimalFormat) NumberFormat.getInstance(Locale.US);
            formatter.applyPattern("#,###,###,###");
            String formattedString = formatter.format(longval);
    
            //setting text after format to EditText
            editText.setText(formattedString);
            editText.setSelection(editText.getText().length());
        } catch (NumberFormatException nfe) {
            nfe.printStackTrace();
        }
    
        editText.addTextChangedListener(this);
    }
    
        import android.text.Editable;
        import android.text.TextWatcher;
        import android.widget.EditText;
    
        import java.text.DecimalFormat;
    
    
        /**
         * Created by srv_twry on 4/12/17.
         * Source: https://stackoverflow.com/a/34265406/137744
         * The custom TextWatcher that automatically adds thousand separators in EditText.
         */
    
        public class ThousandSeparatorTextWatcher implements TextWatcher {
    
            private DecimalFormat df;
            private EditText editText;
            private static String thousandSeparator;
            private static String decimalMarker;
            private int cursorPosition;
    
            public ThousandSeparatorTextWatcher(EditText editText) {
                this.editText = editText;
                df = new DecimalFormat("#,###.##");
                df.setDecimalSeparatorAlwaysShown(true);
                thousandSeparator = Character.toString(df.getDecimalFormatSymbols().getGroupingSeparator());
                decimalMarker = Character.toString(df.getDecimalFormatSymbols().getDecimalSeparator());
            }
    
            @Override
            public void beforeTextChanged(CharSequence charSequence, int start, int count, int after) {
                cursorPosition = editText.getText().toString().length() - editText.getSelectionStart();
            }
    
            @Override
            public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {}
    
            @Override
            public void afterTextChanged(Editable s) {
                try {
                    editText.removeTextChangedListener(this);
                    String value = editText.getText().toString();
    
                    if (value != null && !value.equals("")) {
                        if (value.startsWith(decimalMarker)) {
                            String text = "0" + decimalMarker;
                            editText.setText(text);
                        }
                        if (value.startsWith("0") && !value.startsWith("0" + decimalMarker)) {
                            int index = 0;
                            while (index < value.length() && value.charAt(index) == '0') {
                                index++;
                            }
                            String newValue = Character.toString(value.charAt(0));
                            if (index != 0) {
                                newValue = value.charAt(0) + value.substring(index);
                            }
                            editText.setText(newValue);
                        }
                        String str = editText.getText().toString().replaceAll(thousandSeparator, "");
                        if (!value.equals("")) {
                            editText.setText(getDecimalFormattedString(str));
                        }
                        editText.setSelection(editText.getText().toString().length());
                    }
    
                    //setting the cursor back to where it was
                    editText.setSelection(editText.getText().toString().length() - cursorPosition);
                    editText.addTextChangedListener(this);
                } catch (Exception ex) {
                    ex.printStackTrace();
                    editText.addTextChangedListener(this);
                }
            }
    
            private static String getDecimalFormattedString(String value) {
    
                String[] splitValue = value.split("\\.");
                String beforeDecimal = value;
                String afterDecimal = null;
                String finalResult = "";
    
                if (splitValue.length == 2) {
                    beforeDecimal = splitValue[0];
                    afterDecimal = splitValue[1];
                }
    
                int count = 0;
                for (int i = beforeDecimal.length() - 1; i >= 0 ; i--) {
                    finalResult = beforeDecimal.charAt(i) + finalResult;
                    count++;
                    if (count == 3 && i > 0) {
                        finalResult = thousandSeparator + finalResult;
                        count = 0;
                    }
                }
    
                if (afterDecimal != null) {
                    finalResult = finalResult + decimalMarker + afterDecimal;
                }
    
                return finalResult;
            }
    
            /*
            * Returns the string after removing all the thousands separators.
            * */
            public static String getOriginalString(String string) {
                return string.replace(thousandSeparator,"");
            }
        }
    

    这个解决方案比其他答案有一些优势。例如,即使用户编辑数字的开头或中间,它也会保持光标的位置。其他解决方案总是将光标跳到数字的末尾。它处理小数和整数,以及使用除
    字符以外的字符作为小数分隔符和
    字符作为千分组分隔符的区域设置

    class SeparateThousands(val groupingSeparator: String, val decimalSeparator: String) : TextWatcher {
    
        private var busy = false
    
        override fun afterTextChanged(s: Editable?) {
            if (s != null && !busy) {
                busy = true
    
                var place = 0
    
                val decimalPointIndex = s.indexOf(decimalSeparator)
                var i = if (decimalPointIndex == -1) {
                    s.length - 1
                } else {
                    decimalPointIndex - 1
                }
                while (i >= 0) {
                    val c = s[i]
                    if (c == groupingSeparator[0] ) {
                        s.delete(i, i + 1)
                    } else {
                        if (place % 3 == 0 && place != 0) {
                            // insert a comma to the left of every 3rd digit (counting from right to
                            // left) unless it's the leftmost digit
                            s.insert(i + 1, groupingSeparator)
                        }
                        place++
                    }
                    i--
                }
    
                busy = false
            }
        }
    
        override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {
        }
    
        override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
        }
    }
    
        import android.text.Editable;
        import android.text.TextWatcher;
        import android.widget.EditText;
    
        import java.text.DecimalFormat;
    
    
        /**
         * Created by srv_twry on 4/12/17.
         * Source: https://stackoverflow.com/a/34265406/137744
         * The custom TextWatcher that automatically adds thousand separators in EditText.
         */
    
        public class ThousandSeparatorTextWatcher implements TextWatcher {
    
            private DecimalFormat df;
            private EditText editText;
            private static String thousandSeparator;
            private static String decimalMarker;
            private int cursorPosition;
    
            public ThousandSeparatorTextWatcher(EditText editText) {
                this.editText = editText;
                df = new DecimalFormat("#,###.##");
                df.setDecimalSeparatorAlwaysShown(true);
                thousandSeparator = Character.toString(df.getDecimalFormatSymbols().getGroupingSeparator());
                decimalMarker = Character.toString(df.getDecimalFormatSymbols().getDecimalSeparator());
            }
    
            @Override
            public void beforeTextChanged(CharSequence charSequence, int start, int count, int after) {
                cursorPosition = editText.getText().toString().length() - editText.getSelectionStart();
            }
    
            @Override
            public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {}
    
            @Override
            public void afterTextChanged(Editable s) {
                try {
                    editText.removeTextChangedListener(this);
                    String value = editText.getText().toString();
    
                    if (value != null && !value.equals("")) {
                        if (value.startsWith(decimalMarker)) {
                            String text = "0" + decimalMarker;
                            editText.setText(text);
                        }
                        if (value.startsWith("0") && !value.startsWith("0" + decimalMarker)) {
                            int index = 0;
                            while (index < value.length() && value.charAt(index) == '0') {
                                index++;
                            }
                            String newValue = Character.toString(value.charAt(0));
                            if (index != 0) {
                                newValue = value.charAt(0) + value.substring(index);
                            }
                            editText.setText(newValue);
                        }
                        String str = editText.getText().toString().replaceAll(thousandSeparator, "");
                        if (!value.equals("")) {
                            editText.setText(getDecimalFormattedString(str));
                        }
                        editText.setSelection(editText.getText().toString().length());
                    }
    
                    //setting the cursor back to where it was
                    editText.setSelection(editText.getText().toString().length() - cursorPosition);
                    editText.addTextChangedListener(this);
                } catch (Exception ex) {
                    ex.printStackTrace();
                    editText.addTextChangedListener(this);
                }
            }
    
            private static String getDecimalFormattedString(String value) {
    
                String[] splitValue = value.split("\\.");
                String beforeDecimal = value;
                String afterDecimal = null;
                String finalResult = "";
    
                if (splitValue.length == 2) {
                    beforeDecimal = splitValue[0];
                    afterDecimal = splitValue[1];
                }
    
                int count = 0;
                for (int i = beforeDecimal.length() - 1; i >= 0 ; i--) {
                    finalResult = beforeDecimal.charAt(i) + finalResult;
                    count++;
                    if (count == 3 && i > 0) {
                        finalResult = thousandSeparator + finalResult;
                        count = 0;
                    }
                }
    
                if (afterDecimal != null) {
                    finalResult = finalResult + decimalMarker + afterDecimal;
                }
    
                return finalResult;
            }
    
            /*
            * Returns the string after removing all the thousands separators.
            * */
            public static String getOriginalString(String string) {
                return string.replace(thousandSeparator,"");
            }
        }
    
    然后在xml中:

      <EditText
        android:id="@+id/myNumberField"
        android:digits=",.0123456789"
        android:inputType="numberDecimal"
        .../>
    
        import android.text.Editable;
        import android.text.TextWatcher;
        import android.widget.EditText;
    
        import java.text.DecimalFormat;
    
    
        /**
         * Created by srv_twry on 4/12/17.
         * Source: https://stackoverflow.com/a/34265406/137744
         * The custom TextWatcher that automatically adds thousand separators in EditText.
         */
    
        public class ThousandSeparatorTextWatcher implements TextWatcher {
    
            private DecimalFormat df;
            private EditText editText;
            private static String thousandSeparator;
            private static String decimalMarker;
            private int cursorPosition;
    
            public ThousandSeparatorTextWatcher(EditText editText) {
                this.editText = editText;
                df = new DecimalFormat("#,###.##");
                df.setDecimalSeparatorAlwaysShown(true);
                thousandSeparator = Character.toString(df.getDecimalFormatSymbols().getGroupingSeparator());
                decimalMarker = Character.toString(df.getDecimalFormatSymbols().getDecimalSeparator());
            }
    
            @Override
            public void beforeTextChanged(CharSequence charSequence, int start, int count, int after) {
                cursorPosition = editText.getText().toString().length() - editText.getSelectionStart();
            }
    
            @Override
            public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {}
    
            @Override
            public void afterTextChanged(Editable s) {
                try {
                    editText.removeTextChangedListener(this);
                    String value = editText.getText().toString();
    
                    if (value != null && !value.equals("")) {
                        if (value.startsWith(decimalMarker)) {
                            String text = "0" + decimalMarker;
                            editText.setText(text);
                        }
                        if (value.startsWith("0") && !value.startsWith("0" + decimalMarker)) {
                            int index = 0;
                            while (index < value.length() && value.charAt(index) == '0') {
                                index++;
                            }
                            String newValue = Character.toString(value.charAt(0));
                            if (index != 0) {
                                newValue = value.charAt(0) + value.substring(index);
                            }
                            editText.setText(newValue);
                        }
                        String str = editText.getText().toString().replaceAll(thousandSeparator, "");
                        if (!value.equals("")) {
                            editText.setText(getDecimalFormattedString(str));
                        }
                        editText.setSelection(editText.getText().toString().length());
                    }
    
                    //setting the cursor back to where it was
                    editText.setSelection(editText.getText().toString().length() - cursorPosition);
                    editText.addTextChangedListener(this);
                } catch (Exception ex) {
                    ex.printStackTrace();
                    editText.addTextChangedListener(this);
                }
            }
    
            private static String getDecimalFormattedString(String value) {
    
                String[] splitValue = value.split("\\.");
                String beforeDecimal = value;
                String afterDecimal = null;
                String finalResult = "";
    
                if (splitValue.length == 2) {
                    beforeDecimal = splitValue[0];
                    afterDecimal = splitValue[1];
                }
    
                int count = 0;
                for (int i = beforeDecimal.length() - 1; i >= 0 ; i--) {
                    finalResult = beforeDecimal.charAt(i) + finalResult;
                    count++;
                    if (count == 3 && i > 0) {
                        finalResult = thousandSeparator + finalResult;
                        count = 0;
                    }
                }
    
                if (afterDecimal != null) {
                    finalResult = finalResult + decimalMarker + afterDecimal;
                }
    
                return finalResult;
            }
    
            /*
            * Returns the string after removing all the thousands separators.
            * */
            public static String getOriginalString(String string) {
                return string.replace(thousandSeparator,"");
            }
        }
    

    处理。vs,在不同的语言环境中使用groupingSeparator和decimalSeparator,它们可以来自十进制符号或本地化字符串。

    这是我的
    MilliandNumberEditText

    public class ThousandNumberEditText extends android.support.v7.widget.AppCompatEditText {
        // TODO: 14/09/2017 change it if you want 
        private static final int MAX_LENGTH = 20;
        private static final int MAX_DECIMAL = 3;
    
        public ThousandNumberEditText(Context context) {
            this(context, null);
        }
    
        public ThousandNumberEditText(Context context, AttributeSet attrs) {
            this(context, attrs, android.support.v7.appcompat.R.attr.editTextStyle);
        }
    
        public ThousandNumberEditText(Context context, AttributeSet attrs, int defStyleAttr) {
            super(context, attrs, defStyleAttr);
            init();
        }
    
        private void init() {
            addTextChangedListener(new ThousandNumberTextWatcher(this));
            setInputType(InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_FLAG_DECIMAL);
            setFilters(new InputFilter[] { new InputFilter.LengthFilter(MAX_LENGTH) });
            setHint("0"); // TODO: 14/09/2017 change it if you want 
        }
    
        private static class ThousandNumberTextWatcher implements TextWatcher {
    
            private EditText mEditText;
    
            ThousandNumberTextWatcher(EditText editText) {
                mEditText = 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) {
                String originalString = editable.toString();
                String cleanString = originalString.replaceAll("[,]", "");
                if (cleanString.isEmpty()) {
                    return;
                }
                String formattedString = getFormatString(cleanString);
    
                mEditText.removeTextChangedListener(this);
                mEditText.setText(formattedString);
                mEditText.setSelection(mEditText.getText().length());
                mEditText.addTextChangedListener(this);
            }
    
            /**
             * Return the format string
             */
            private String getFormatString(String cleanString) {
                if (cleanString.contains(".")) {
                    return formatDecimal(cleanString);
                } else {
                    return formatInteger(cleanString);
                }
            }
    
            private String formatInteger(String str) {
                BigDecimal parsed = new BigDecimal(str);
                DecimalFormat formatter;
                formatter = new DecimalFormat("#,###");
                return formatter.format(parsed);
            }
    
            private String formatDecimal(String str) {
                if (str.equals(".")) {
                    return ".";
                }
                BigDecimal parsed = new BigDecimal(str);
                DecimalFormat formatter;
                formatter =
                        new DecimalFormat("#,###." + getDecimalPattern(str)); //example patter #,###.00
                return formatter.format(parsed);
            }
    
            /**
             * It will return suitable pattern for format decimal
             * For example: 10.2 -> return 0 | 10.23 -> return 00 | 10.235 -> return 000
             */
            private String getDecimalPattern(String str) {
                int decimalCount = str.length() - 1 - str.indexOf(".");
                StringBuilder decimalPattern = new StringBuilder();
                for (int i = 0; i < decimalCount && i < MAX_DECIMAL; i++) {
                    decimalPattern.append("0");
                }
                return decimalPattern.toString();
            }
        }
    }
    
        import android.text.Editable;
        import android.text.TextWatcher;
        import android.widget.EditText;
    
        import java.text.DecimalFormat;
    
    
        /**
         * Created by srv_twry on 4/12/17.
         * Source: https://stackoverflow.com/a/34265406/137744
         * The custom TextWatcher that automatically adds thousand separators in EditText.
         */
    
        public class ThousandSeparatorTextWatcher implements TextWatcher {
    
            private DecimalFormat df;
            private EditText editText;
            private static String thousandSeparator;
            private static String decimalMarker;
            private int cursorPosition;
    
            public ThousandSeparatorTextWatcher(EditText editText) {
                this.editText = editText;
                df = new DecimalFormat("#,###.##");
                df.setDecimalSeparatorAlwaysShown(true);
                thousandSeparator = Character.toString(df.getDecimalFormatSymbols().getGroupingSeparator());
                decimalMarker = Character.toString(df.getDecimalFormatSymbols().getDecimalSeparator());
            }
    
            @Override
            public void beforeTextChanged(CharSequence charSequence, int start, int count, int after) {
                cursorPosition = editText.getText().toString().length() - editText.getSelectionStart();
            }
    
            @Override
            public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {}
    
            @Override
            public void afterTextChanged(Editable s) {
                try {
                    editText.removeTextChangedListener(this);
                    String value = editText.getText().toString();
    
                    if (value != null && !value.equals("")) {
                        if (value.startsWith(decimalMarker)) {
                            String text = "0" + decimalMarker;
                            editText.setText(text);
                        }
                        if (value.startsWith("0") && !value.startsWith("0" + decimalMarker)) {
                            int index = 0;
                            while (index < value.length() && value.charAt(index) == '0') {
                                index++;
                            }
                            String newValue = Character.toString(value.charAt(0));
                            if (index != 0) {
                                newValue = value.charAt(0) + value.substring(index);
                            }
                            editText.setText(newValue);
                        }
                        String str = editText.getText().toString().replaceAll(thousandSeparator, "");
                        if (!value.equals("")) {
                            editText.setText(getDecimalFormattedString(str));
                        }
                        editText.setSelection(editText.getText().toString().length());
                    }
    
                    //setting the cursor back to where it was
                    editText.setSelection(editText.getText().toString().length() - cursorPosition);
                    editText.addTextChangedListener(this);
                } catch (Exception ex) {
                    ex.printStackTrace();
                    editText.addTextChangedListener(this);
                }
            }
    
            private static String getDecimalFormattedString(String value) {
    
                String[] splitValue = value.split("\\.");
                String beforeDecimal = value;
                String afterDecimal = null;
                String finalResult = "";
    
                if (splitValue.length == 2) {
                    beforeDecimal = splitValue[0];
                    afterDecimal = splitValue[1];
                }
    
                int count = 0;
                for (int i = beforeDecimal.length() - 1; i >= 0 ; i--) {
                    finalResult = beforeDecimal.charAt(i) + finalResult;
                    count++;
                    if (count == 3 && i > 0) {
                        finalResult = thousandSeparator + finalResult;
                        count = 0;
                    }
                }
    
                if (afterDecimal != null) {
                    finalResult = finalResult + decimalMarker + afterDecimal;
                }
    
                return finalResult;
            }
    
            /*
            * Returns the string after removing all the thousands separators.
            * */
            public static String getOriginalString(String string) {
                return string.replace(thousandSeparator,"");
            }
        }
    
    public类thounandnumberedittext扩展了android.support.v7.widget.appcompatittext{
    //TODO:14/09/2017如果你想更改它
    专用静态最终整数最大长度=20;
    私有静态最终整数MAX_DECIMAL=3;
    公共千位数文本(上下文){
    这个(上下文,空);
    }
    公共千位数属性文本(上下文上下文,属性集属性){
    这(context、attrs、android.support.v7.appcompat.R.attr.editTextStyle);
    }
    公共千位数属性文本(上下文上下文、属性集属性、int-defStyleAttr){
    super(上下文、attrs、defStyleAttr);
    init();
    }
    私有void init(){
    addTextChangedListener(新的千位数ExtWatcher(本));
    setInputType(InputType.TYPE_类别_编号| InputType.TYPE_编号_标志_小数);
    setFilters(新的InputFilter[]{new InputFilter.LengthFilter(最大长度)});