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

如何配置Yup.number().integer()将1.0识别为非整数?

解决Yup验证整数时允许1.0的问题

JS 中 1.0 属于数值类型的整数,Number.isInteger(1.0) 会返回 true,所以单纯用 Yup.number().integer() 或基于 Number.isInteger 的自定义校验无法区分 1 和 1.0。要实现**拒绝带小数点的整数格式(如1.0、2.00)**的需求,需要同时检查输入的格式和数值有效性。

以下是两种可行的解决方案:

方案一:自定义test校验,同时检查格式与数值

通过 Yup.test() 同时验证输入字符串是否包含小数点,以及数值是否为有效整数:

const schema = Yup.object().shape({
  yourIntegerField: Yup.number()
    .test(
      'integer-format',
      '请输入整数(不能带小数点)',
      function(value) {
        // 处理空值(如需禁止空值可删除此判断,添加.required())
        if (value === null || value === undefined) return true;
        
        const numValue = Number(value);
        // 排除非数字值
        if (isNaN(numValue)) return false;
        
        // 检查字符串形式是否包含小数点
        const strValue = String(value);
        if (strValue.includes('.')) return false;
        
        // 确保数值为整数
        return Number.isInteger(numValue);
      }
    )
});

方案二:先验证字符串格式,再转换为数字

如果表单输入的原始值是字符串,可先通过正则匹配整数格式,再转换为数字类型:

const schema = Yup.object().shape({
  yourIntegerField: Yup.string()
    // 正则匹配正负整数,禁止小数点
    .matches(/^-?\d+$/, '请输入整数(不能带小数点)')
    // 将合法字符串转换为数字
    .transform((val) => val ? Number(val) : null)
    // 如需禁止空值,添加.required()
    .nullable()
});

说明

  • 方案一适用于输入值可能是数字或字符串的场景,通过字符串格式检查拦截带小数点的输入;
  • 方案二更适用于表单输入为字符串的场景,从源头拦截不符合格式的内容,再转换为后端需要的数字类型。

内容的提问来源于stack exchange,提问作者Hoa Do

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 01:46:28