使用JavaScript或jQuery实现智利RUT号码实时格式化
智利RUT身份证输入实时格式化实现
嘿,我来帮你搞定这个智利RUT的实时格式化需求!根据你提到的两种格式(老年人用1.234.567-8、年轻人用12.345.678-9),我完善了代码,不仅能自动插入分隔符,还处理了光标位置、校验位X的兼容,让用户输入更顺畅。
完整代码实现
<input type="text" class="inputs" name="cliente" id="cliente" placeholder="Ingrese su RUT"> <script> // 给输入框绑定输入事件(覆盖输入、粘贴等所有修改场景) document.getElementById('cliente').addEventListener('input', function(e) { // 保存当前光标位置,避免格式化后光标跳到末尾 const cursorPos = e.target.selectionStart; const originalVal = e.target.value; // 格式化输入内容 const formattedVal = formatRut(originalVal); // 计算光标需要调整的偏移量(因为插入了分隔符) const originalSeparators = (originalVal.match(/[.-]/g) || []).length; const newSeparators = (formattedVal.match(/[.-]/g) || []).length; const cursorOffset = newSeparators - originalSeparators; // 设置格式化后的值和光标位置 e.target.value = formattedVal; e.target.setSelectionRange(cursorPos + cursorOffset, cursorPos + cursorOffset); }); // 核心格式化函数 function formatRut(input) { // 第一步:清理输入,只保留数字和X/x,转大写(智利RUT校验位X为大写) let cleaned = input.replace(/[^0-9Xx]/g, '').toUpperCase(); // 限制最大长度(年轻人RUT最多8位数字+1位校验位,共9位有效字符) cleaned = cleaned.slice(0, 9); // 第二步:根据有效字符长度选择对应格式 if (cleaned.length <= 7) { // 老年人格式:1.234.567-8 const parts = []; // 第一段:第1位数字 parts.push(cleaned.slice(0, 1)); // 第二段:接下来的3位(如果有) if (cleaned.length > 1) parts.push(cleaned.slice(1, 4)); // 第三段:再接下来的3位(如果有) if (cleaned.length > 4) parts.push(cleaned.slice(4, 7)); // 校验位(第7位之后的字符) const checkDigit = cleaned.slice(7); // 拼接部分,过滤空值,再加上校验位(如果有) let formatted = parts.filter(Boolean).join('.'); return checkDigit ? `${formatted}-${checkDigit}` : formatted; } else { // 年轻人格式:12.345.678-9 const parts = []; // 第一段:前2位数字 parts.push(cleaned.slice(0, 2)); // 第二段:接下来的3位(如果有) if (cleaned.length > 2) parts.push(cleaned.slice(2, 5)); // 第三段:再接下来的3位(如果有) if (cleaned.length > 5) parts.push(cleaned.slice(5, 8)); // 校验位(第8位之后的字符) const checkDigit = cleaned.slice(8); // 拼接部分,过滤空值,再加上校验位(如果有) let formatted = parts.filter(Boolean).join('.'); return checkDigit ? `${formatted}-${checkDigit}` : formatted; } } </script>
关键功能说明
- 自动清理无效字符:用户输入的空格、符号都会被自动过滤,只保留数字和校验位X
- 智能切换格式:根据输入的有效字符长度自动适配老年人/年轻人的格式
- 光标位置保持:格式化后光标不会跳到末尾,用户可以连续输入或修改中间内容
- 支持校验位X:兼容智利RUT中常见的大写X校验位
- 长度限制:自动截断超过9位的有效字符,符合RUT的规范
内容的提问来源于stack exchange,提问作者NICALANICA
相关产品推荐
相关产品推荐

