写一个方法,实时验证input输入的值是否满足金额如:3.56(最多只有两位小数且只能数字和小数点)的格式,其它特殊字符禁止输入

function validateAmount(inputElement) {
  let value = inputElement.value;

  // 使用正则表达式匹配,允许开头为可选的负号,然后是数字和小数点,最多两位小数
  const regex = /^-?\d+(\.\d{0,2})?$/;

  if (!regex.test(value)) {
    // 如果不匹配,则去除无效字符
    inputElement.value = value.replace(/[^0-9.-]/g, '');

    // 处理多个小数点的情况,只保留第一个
    const decimalCount = (inputElement.value.match(/\./g) || []).length;
    if (decimalCount > 1) {
      inputElement.value = inputElement.value.replace(/\./g, (match, offset, string) => {
        return offset === string.indexOf('.') ? '.' : '';
      });
    }


    // 处理负号位置,只能在开头
    if (inputElement.value.startsWith('-') && inputElement.value.lastIndexOf('-') !== 0) {
       inputElement.value = '-' + inputElement.value.replace(/-/g, '');
    } else if (!inputElement.value.startsWith('-') && inputElement.value.includes('-')) {
        inputElement.value = inputElement.value.replace(/-/g, '');
    }


    // 处理以小数点开头的情况,前面加 0
    if (inputElement.value.startsWith('.')) {
      inputElement.value = '0' + inputElement.value;
    }

     // 处理负号和小数点一起开头的情况,前面加 0
    if (inputElement.value.startsWith('-.')) {
      inputElement.value = '-0' + inputElement.value.substring(1);
    }


    // 限制小数位数
    const parts = inputElement.value.split('.');
    if (parts.length === 2 && parts[1].length > 2) {
      inputElement.value = parts[0] + '.' + parts[1].substring(0, 2);
    }

  }
}



//  绑定input事件
const amountInput = document.getElementById('amountInput'); //  将 'amountInput' 替换为你输入框的ID

if (amountInput) {
  amountInput.addEventListener('input', function(event) {
    validateAmount(this);
  });
}


HTML示例:

<input type="text" id="amountInput" placeholder="请输入金额">

代码解释和改进:

  1. 正则表达式: 使用^-?\d+(\.\d{0,2})?$ 来匹配金额格式。

    • ^: 匹配字符串的开头。
    • -?: 匹配可选的负号。
    • \d+: 匹配一个或多个数字。
    • (\.\d{0,2})?: 匹配可选的小数部分,最多两位小数。
    • $: 匹配字符串的结尾。
  2. 实时校验: 使用 input 事件监听输入框的变化,并在每次输入时进行校验。

  3. 无效字符处理: 使用 replace(/[^0-9.-]/g, '') 去除任何非数字、小数点和负号的字符。

  4. 多个小数点处理: 代码现在可以处理多个小数点的情况,只保留第一个。

  5. 负号位置处理: 确保负号只能出现在开头。

  6. 小数点开头处理: 如果输入以小数点开头,则自动在前面添加 0

  7. 负号和小数点一起开头处理: 如果输入以 -. 开头,则自动在前面添加 0

  8. 小数位数限制: 限制小数部分最多只能有两位。

  9. getElementById 的错误处理: 添加了 if (amountInput) 来检查是否找到了元素,避免空指针错误。

这个改进后的版本更加健壮,可以处理各种边缘情况,并提供更好的用户体验。 它能实时响应用户的输入,并确保输入框中的值始终符合金额格式的要求。

posted @ 2024-12-07 09:21  王铁柱6  阅读(83)  评论(0)    收藏  举报