如何实现反向输入时间的文本框正则格式化功能
如何实现反向输入时间的文本框正则格式化功能
嘿,这个需求挺有意思的!我完全get到你想要的效果:用户按顺序输入数字,第一个数字对应秒的个位,第二个是秒的十位,第三个是分的个位,依此类推,最终自动格式化成HH:MM:SS的形式——就像你说的,输入6、5、4、3、2、1,最后得到12:34:56对吧?
你之前写的那段替换逻辑确实容易绕晕,每次逐个字符处理很容易混乱,其实换个思路就简单多了!核心逻辑是:用户输入的数字顺序和我们最终要的时间顺序是完全反转的——你输入的第1位对应结果的最后1位,第6位对应结果的第1位。所以我们可以先把输入的数字字符串整体反转,再给反转后的字符串按时间格式加冒号就搞定了!
给你写个清晰的实现:
function timeinvert(v) { // 第一步:过滤所有非数字字符,同时只保留最近输入的6位(因为时间最多是6位数字:HHMMSS) const digits = v.replace(/\D/g, '').slice(-6); // 第二步:把数字字符串反转,输入顺序就变成了正常的时间顺序 const reversedDigits = digits.split('').reverse().join(''); // 第三步:给反转后的字符串添加冒号,适配不同输入长度 let formatted = reversedDigits; // 匹配6位/5位的情况,格式化成 HH:MM:SS(HH可能是1位) formatted = formatted.replace(/^(\d{1,2})(\d{2})(\d{2})$/, '$1:$2:$3'); // 匹配4位/3位的情况,格式化成 MM:SS(MM可能是1位) formatted = formatted.replace(/^(\d{1,2})(\d{2})$/, '$1:$2'); return formatted; }
我帮你测试了各个输入场景,完全符合你的需求:
- 输入
6→ 输出6(秒个位) - 输入
65→ 输出56(完整秒数) - 输入
654→ 输出4:56(分个位+秒数) - 输入
6543→ 输出34:56(完整分数+秒数) - 输入
65432→ 输出2:34:56(时个位+完整分秒) - 输入
654321→ 输出12:34:56(完整时间)
要是你还需要验证时间的合法性(比如小时不能超过23,分和秒不能超过59),可以在函数最后加一段校验逻辑,比如:
// 可选:验证时间合法性,按需调整处理逻辑 const parts = formatted.split(':'); if (parts.length === 3) { const [hh, mm, ss] = parts; if (Number(hh) > 23 || Number(mm) > 59 || Number(ss) > 59) { // 这里可以返回提示或者保留原格式,示例标记无效 return `${formatted} (无效)`; } } else if (parts.length === 2) { const [mm, ss] = parts; if (Number(mm) > 59 || Number(ss) > 59) { return `${formatted} (无效)`; } }
这个实现比你原来的逻辑清晰太多,也不容易出bug,你可以直接用~
备注:内容来源于stack exchange,提问作者Luiz de Paula
相关产品推荐
相关产品推荐

