数字和小数值的Angular 2自定义验证

时间:2017-06-14 03:32:28

标签: javascript angular typescript

我有一个自定义验证器,用于检查输入字段是否输入了一个数字。 enter image description here

代码如下:

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

export class NumberValidators {

  static isNumberCheck(): ValidatorFn {
    return  (c: AbstractControl): {[key: string]: boolean} | null => {
      if (c.value !== undefined && (isNaN(c.value))) {
        return { 'value': true };
      }

      return null;
    };
  }
}

但我遇到的问题是,当我输入一个十进制值时,它会提升我不想要的验证标志。我希望输入字段有整数和十进制数。有人可以帮我解决这个问题。

下面是我使用parsleyjs进行验证的模板代码



<div class="form-group row">
              <label for="upperbeltposition" class="col-md-6 col-form-label">Upper Belt Position (mm) <span class="required">*</span></label>
              <div class="col-md-5">
                <input class="form-control input-transparent " id="upperbeltposition" type="text" formControlName="upperbeltposition"  data-parsley-trigger="blur"
                  required="required" data-parsley-type="number"/>
              </div>
            </div>
             <div class="form-group row">
              <label for="platformxposition" class="col-md-6 col-form-label">Platform X Position (mm) <span class="required">*</span></label>
              <div class="col-md-5">
                <input class="form-control input-transparent " id="platformxposition" type="text" formControlName="platformxposition"  data-parsley-trigger="blur"
                  required="required" data-parsley-type="number"/>
              </div>
            </div>
             <div class="form-group row">
              <label for="platformyposition" class="col-md-6 col-form-label">Platform Y Position (mm) <span class="required">*</span></label>
              <div class="col-md-5">
                <input class="form-control input-transparent " id="platformyposition" type="text" formControlName="platformyposition"  data-parsley-trigger="blur"
                  required="required" data-parsley-type="number"/>
              </div>
            </div>
&#13;
&#13;
&#13;

在我的组件中我使用的是Reactive表单,下面是我的代码

&#13;
&#13;
upperbeltposition: ['', [Validators.required, NumberValidators.isNumberCheck]],
platformxposition: ['', [Validators.required, NumberValidators.isNumberCheck]],
platformyposition: ['', [Validators.required, NumberValidators.isNumberCheck]]
&#13;
&#13;
&#13;

谢谢!

4 个答案:

答案 0 :(得分:6)

可以使用ng-pattern验证

  ng-pattern="^[0-9]+(.[0-9]{0,2})?$"
你可以这样检查一次吗

  <label for="upperbeltposition" class="col-md-6 col-form-label" name="number">Upper Belt 
     Position (mm)
      <span class="required">*</span>
  </label>
   <div class="col-md-5">
   <input class="form-control input-transparent " id="upperbeltposition" type="text" formControlName="upperbeltposition"  data-parsley-trigger="blur"
    required="required" data-parsley-type="number"/> 
 <span  ng-show="submitForm &&platformxposition 
    .number.$error.pattern">This value should be a valid number
</span>

  </div>

您必须添加表单名称。和输入字段名称。$ error.pattern

答案 1 :(得分:5)

这样的事情应该有效

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

export class NumberValidators {

  static isNumberCheck(): ValidatorFn {
    return  (c: AbstractControl): {[key: string]: boolean} | null => {
      let number = /^[.\d]+$/.test(c.value) ? +c.value : NaN;
      if (number !== number) {
        return { 'value': true };
      }

      return null;
    };
  }
}

答案 2 :(得分:1)

除了创建自定义验证器之外,您还可以简单地使用Validators.pattern

https://angular.io/api/forms/Validators#pattern

['', [Validators.required, Validators.pattern(/^[.\d]+$/)]]

答案 3 :(得分:0)

有点晚了,但也许对其他人有帮助。

此正则表达式将检查十进制值的有效性:

Validators.pattern(/^[-+]?([1-9]{1}\d*|0{1})(\.?)(?(2)\d+)$/) 

以下值/模式有效:

  • 123.7897
  • 12
  • 0.4897
  • +238.345
  • -238.345

以00开头的值无效,因此尽管从技术上说00是数字/十进制,但从功能上来说不是。

在模式验证器或您自己的验证器中使用此正则表达式

{{1}}