You need to enable JavaScript to run this app. Angular中如何编写仅接受0-30整数、拒绝小数的表单校验器
优惠活动
大模型
产品
解决方案
定价
更多

Angular中如何编写仅接受0-30整数、拒绝小数的表单校验器

Angular 0-30区间整数校验实现方案

现有内置规则的缺陷说明

Angular内置的Validators.min(0)、Validators.max(30)仅做数值大小判断,只要输入值为有效数字,哪怕是0.1、20.1这类落在区间内的小数,都会判定为校验通过,完全没有整数校验能力,无法满足拦截小数输入的业务要求。

自定义校验逻辑实现

所有自定义校验函数完全兼容Angular响应式表单的校验接口,可直接替换原有内置规则使用。

方案1:原生数值判断实现(无正则依赖)

该方案借助JS原生Number.isInteger方法判断整数属性,逻辑直白无边界坑,同时兼容数字、字符串类型的输入值。
实现代码:

import { AbstractControl, ValidationErrors, ValidatorFn } from '@angular/forms';

export const rangeIntegerValidator = (): ValidatorFn => {
  return (control: AbstractControl): ValidationErrors | null => {
    const inputVal = control.value;
    // 空值直接放行,适配非必填表单场景
    if (inputVal === null || inputVal === undefined || inputVal === '') {
      return null;
    }
    // 拦截非数字类无效输入
    const numVal = Number(inputVal);
    if (Number.isNaN(numVal)) {
      return { invalidNumber: '请输入有效数字' };
    }
    // 核心整数校验:拦截所有小数类输入
    if (!Number.isInteger(numVal)) {
      return { notInteger: '仅允许输入整数,不支持小数' };
    }
    // 0-30闭区间范围校验
    if (numVal < 0 || numVal > 30) {
      return { outOfRange: '输入数值需在0到30区间内' };
    }
    return null;
  };
};

方案2:正则匹配实现

如果业务要求统一通过正则做输入合法性校验,可直接使用以下规则匹配0-30区间内的纯整数,天然拦截小数、超范围值、非数字输入。
匹配正则:
/^(0|[1-9]\d?|30)$

  • 规则说明:匹配开头到结尾全内容,单独匹配合法值0、1-29的正整数、上限值30,规则内不允许出现小数点、负号、非数字字符,从根源拦截小数输入。
    对应校验函数实现:
import { AbstractControl, ValidationErrors, ValidatorFn } from '@angular/forms';

export const rangeIntegerRegexValidator = (): ValidatorFn => {
  const validRangeReg = /^(0|[1-9]\d?|30)$/;
  return (control: AbstractControl): ValidationErrors | null => {
    const inputVal = control.value;
    // 空值直接放行,适配非必填表单场景
    if (inputVal === null || inputVal === undefined || inputVal === '') {
      return null;
    }
    // 去除输入前后的空格后做匹配,避免用户误输入空格导致的校验异常
    const strVal = String(inputVal).trim();
    if (!validRangeReg.test(strVal)) {
      return { invalidInput: '仅允许输入0-30之间的整数,不支持小数' };
    }
    return null;
  };
};

表单使用方式

两种校验器的调用方式和Angular内置校验器完全一致,在初始化表单时直接传入校验规则列表即可:

this.formGroup = this.fb.group({
  // 方案1使用示例
  score: ['', [rangeIntegerValidator()]],
  // 方案2使用示例
  // score: ['', [rangeIntegerRegexValidator()]]
});

校验效果对照

  • 合法输入:0、2、20、30 → 校验通过
  • 非法输入:-1、0.1、20.1、30.9、任意非数字内容 → 校验拦截

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.01 00:54:03