Android RecyclerView中EditText数字每三位自动加逗号格式化异常的修复咨询
Android RecyclerView中EditText数字每三位自动加逗号格式化异常的修复咨询
嘿,我来帮你搞定这个数字格式化的问题~ 你现在遇到的问题根源在于当前的逻辑是从左往右按字符串长度取模来插入逗号,但数字的千位分隔规则是从右往左每三位加逗号,这完全搞反了方向,自然会出现格式错误。
比如55200长度是5,按你现在的CHAR_COUNT_FOR_GROUPING=5取模,会在倒数第一位前插逗号,就变成了5520,0;而正确的做法应该是从右数第三位,也就是55后面插逗号,得到55,200。
下面给你调整后的完整解决方案,同时兼顾带%前缀的输入场景:
修复步骤说明
- 先过滤掉输入中已有的逗号,避免重复处理
- 区分带%前缀和纯数字的情况:如果是%开头,先分离前缀,处理后面的数字部分再拼接回去
- 从右往左遍历数字字符串,每三位插入一个逗号
- 处理TextWatcher时要临时移除监听,避免因为修改文本触发无限循环
修改后的代码实现
holder.uiBinding.edtTube.addTextChangedListener(new TextWatcher() { private static final char COMMA = ','; private boolean isFormatting = false; // 标记是否正在格式化,避免循环触发 @Override public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { } @Override public void onTextChanged(CharSequence s, int start, int before, int count) { } @Override public void afterTextChanged(Editable s) { // 如果正在格式化,直接返回,避免无限循环 if (isFormatting) { return; } isFormatting = true; // 1. 先保存原始内容,去掉所有逗号 String originalText = s.toString().replace(String.valueOf(COMMA), ""); StringBuilder formattedText = new StringBuilder(); // 2. 处理带%前缀的情况 String prefix = ""; String numberPart = originalText; if (originalText.startsWith("%")) { prefix = "%"; numberPart = originalText.substring(1); } // 3. 从右往左遍历数字部分,每三位插入逗号 int length = numberPart.length(); int commaCount = 0; for (int i = length - 1; i >= 0; i--) { formattedText.insert(0, numberPart.charAt(i)); commaCount++; // 每三位插入逗号,且不是在最开头的位置 if (commaCount % 3 == 0 && i != 0) { formattedText.insert(0, COMMA); } } // 4. 拼接前缀和格式化后的数字 s.clear(); s.append(prefix).append(formattedText); isFormatting = false; } });
效果验证
- 输入55200 → 自动格式化为55,200
- 输入1230000 → 自动格式化为1,230,000
- 输入%12300 → 自动格式化为%12,300
- 输入%5 → 保持%5不变
这样处理后,就能完全符合你需求的两种输入格式啦~
内容来源于stack exchange
相关产品推荐
相关产品推荐

