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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:36:02