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

Yup验证允许输入以0开头的数值,未触发自定义验证提示问题

解决Yup验证数字时允许前导零的问题

问题出在Yup的number()方法会自动把带前导零的字符串(比如"02")解析成数字2,而2在你设置的2-20范围内,所以不会触发验证提示。要拦截这种输入,需要同时检查输入的字符串格式和数值范围,以下是两种可行方案:

方案一:先验证字符串格式,再转数字验证范围

通过string()类型先校验输入的格式,确保没有前导零,再转换为数字验证数值范围:

optionYear: Yup.string()
  // 正则匹配1-9开头的1或2位数字,排除前导零
  .matches(/^[1-9]\d?$/, 'Enter between 2 to 20 years')
  // 将字符串转换为数字
  .transform(val => val ? parseInt(val, 10) : null)
  // 验证数值范围
  .test('year-range', 'Enter between 2 to 20 years', val => {
    return val >= 2 && val <= 20;
  })

方案二:在number验证中添加自定义前导零检查

保留number()类型,通过test方法获取原始输入的字符串值,检查是否存在前导零:

optionYear: Yup.number()
  .min(2, 'Enter between 2 to 20 years')
  .max(20, 'Enter between 2 to 20 years')
  .test('no-leading-zero', 'Enter between 2 to 20 years', function(value) {
    // 获取表单中的原始输入值(未被Yup转换的字符串)
    const rawInput = this.parent.optionYear;
    // 如果原始输入是长度大于1的字符串且以0开头,返回验证失败
    if (typeof rawInput === 'string' && rawInput.length > 1 && rawInput.startsWith('0')) {
      return false;
    }
    return true;
  })

两种方案都能拦截"02"这类带前导零的输入,触发你设置的验证提示。

内容的提问来源于stack exchange,提问作者Alyssa Reyes

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 08:07:44