JS计算输入框输入的长度

需求来源

开发的时候有时候会有这样的需求:
给一个输入框,在提交的时候需要校验输入的内容的长度不能超过20,详细校验规则如下:

  • 中文算一个字
  • 英文字母和数字两个算一个字

因为在视觉上,英文字母和数字占用的空间比较小,所以上面的要求也是合理的。

实现方案

很明显,我们现在就不能通过字符串的length属性来判断这个值的长度,因为length属性不管是中文、英文、数字都算是一个字符;

其实实现方案也比较多,接下来我这边使用一个简单的实现,具体原理就是:
正则匹配字母数字和其他占位置小的字符,将其长度统计为1,剩余的都统计为2;长度累加的结果除以2就是,我们想要的长度;
为了防止出现小数的情况,我们将除以2的结果向上取整处理。

/**
 * 获取输入内容的长度
 * @param value
 * @return 内容的长度
 */
export const getInputSize = (value: string): number => {
  if (!value) {
    return 0
  }
  const charCount = value.split('').reduce((prev, curr) => {
    // 英文字母和数字等算一个字符;这个暂时还不完善;
    if (/[a-z]|[0-9]|[,;.!@#-+/\\$%^*()<>?:"'{}~]/i.test(curr)) {
      return prev + 1
    }
    // 其他的算是2个字符
    return prev + 2
  }, 0)

  // 向上取整,防止出现半个字的情况
  return Math.ceil(charCount / 2)
}
// 使用方法
getInputSize('你好123') // 4
getInputSize('混合输入1哈哈35') // 8
getInputSize('这里有标点符号!@@%') // 9

留下回复