You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Android EditText粘贴数字后自动完成内容格式化

实现Android EditText粘贴数字自动格式化方案

前置布局调整说明

你当前的布局配置需要微调,原有android:inputType="number"仅支持输入纯数字,无法展示格式化需要的.和-符号,建议修改为如下配置:

<EditText
    android:id="@+id/user_number_id"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_gravity="center_vertical"
    android:layout_marginStart="@dimen/_12sdp"
    android:layout_marginBottom="@dimen/_12sdp"
    android:background="@color/white"
    android:inputType="textNoSuggestions"
    android:digits="0123456789.-"
    android:maxLength="14"
    android:paddingTop="@dimen/_2sdp"
    android:text="Your Number: "
    android:textSize="@dimen/_15sp" />

新增的android:digits属性会限制仅允许输入数字、点、横杠,避免用户输入其他无效字符。

Java代码实现

直接给EditText添加TextWatcher监听即可,不管是手动输入还是粘贴内容都会自动触发格式化,不需要单独监听粘贴事件:

import android.text.Editable;
import android.text.TextWatcher;
import android.widget.EditText;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;

public class MainActivity extends AppCompatActivity {
    // 格式化标记位,避免afterTextChanged递归触发死循环
    private boolean isFormatting = false;
    private EditText etUserNumber;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        etUserNumber = findViewById(R.id.user_number_id);
        etUserNumber.addTextChangedListener(new TextWatcher() {
            @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) {
                if (isFormatting) {
                    return;
                }
                isFormatting = true;
                
                // 先移除前缀和所有非数字字符,拿到原始纯数字内容
                String originStr = s.toString().replace("Your Number: ", "").replaceAll("[^0-9]", "");
                String formattedStr = formatNumber(originStr);
                // 替换为格式化后的内容,保留默认前缀
                s.replace(0, s.length(), "Your Number: " + formattedStr);
                
                isFormatting = false;
            }
        });
    }

    // 按xxx.xxx.xxx-xx规则格式化数字
    private String formatNumber(String rawNumber) {
        StringBuilder sb = new StringBuilder();
        int length = rawNumber.length();
        // 最大处理11位数字,匹配示例输入长度
        int maxLength = Math.min(length, 11);
        for (int i = 0; i < maxLength; i++) {
            sb.append(rawNumber.charAt(i));
            // 第3位、第6位后追加点
            if ((i == 2 || i == 5) && i != maxLength - 1) {
                sb.append(".");
            }
            // 第9位后追加横杠
            else if (i == 8 && i != maxLength - 1) {
                sb.append("-");
            }
        }
        return sb.toString();
    }
}

效果验证

粘贴23989723412到控件后,会自动提取11位纯数字,格式化为239.897.234-12,符合要求的格式规则。如果输入数字不足11位,会按当前长度逐步追加符号,不会出现多余无效符号。

内容的提问来源于stack exchange,提问作者Mir Stephen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.11 15:21:00