如何在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
相关产品推荐
相关产品推荐

