source

입력 유형 번호 "숫자 값만" 유효성 검사

manycodes 2023. 9. 23. 22:50
반응형

입력 유형 번호 "숫자 값만" 유효성 검사

입력을 확인하려면 어떻게 해야 합니까?type="number"값이 숫자이거나 null인 경우에만 유효(지시 사항 없음)?
숫자만[0-9]그리고 .는 허용되며, "e" 또는 다른 문자는 허용되지 않습니다.


지금까지 시도한 것:

템플릿:

<form [formGroup]="form" novalidate>
    <input type="number" formControlName="number" id="number">
</form>

구성요소:

export class App {
  form: FormGroup = new FormGroup({});

  constructor(
    private fb: FormBuilder,
  ) {
    this.form = fb.group({
      number: ['', [CustomValidator.numeric]]
    })
  }
}

사용자 정의 검증자:

export class CustomValidator{
  // Number only validation
  static numeric(control: AbstractControl) {
    let val = control.value;

    if (val === null || val === '') return null;

    if (!val.toString().match(/^[0-9]+(\.?[0-9]+)?$/)) return { 'invalidNumber': true };

    return null;
  }
}

플렁커

문제는 사용자가 숫자("123e" 또는 "abc")가 아닌 것을 입력하면 FormControl의 값이 됩니다.null, 필드가 필요하지 않기를 원하기 때문에 필드가 정말 비어 있는 경우null값이 유효해야 합니다.

크로스 브라우저 지원도 중요합니다(Chrome의 숫자 입력 필드는 사용자가 "e"를 제외하고 문자를 입력할 수 없지만 FireFox와 Safari는 가능합니다).

HTML 파일에서 이와 같은 패턴에 대해 ngIf를 추가할 수 있습니다.

<div class="form-control-feedback" *ngIf="Mobile.errors && (Mobile.dirty || Mobile.touched)">
        <p *ngIf="Mobile.errors.pattern" class="text-danger">Number Only</p>
      </div>

.ts파일에 Validators 패턴을 추가할 수 있습니다 -"^[0-9]*$"

this.Mobile = new FormControl('', [
  Validators.required,
  Validators.pattern("^[0-9]*$"),
  Validators.minLength(8),
]);

지시를 사용하면 애플리케이션 전반에 걸쳐 사용할 수 있고 간편해집니다.

HTML

<input type="text" placeholder="Enter value" numbersOnly>

~하듯이.keyCode()그리고..which()사용되지 않습니다. 코드는 다음을 사용하여 코드를 확인합니다..key()참조처

지시:

@Directive({
   selector: "[numbersOnly]"
})

export class NumbersOnlyDirective {
  @Input() numbersOnly:boolean;

  navigationKeys: Array<string> = ['Backspace']; //Add keys as per requirement
  
  constructor(private _el: ElementRef) { }

  @HostListener('keydown', ['$event']) onKeyDown(e: KeyboardEvent) {
    
    if (
      // Allow: Delete, Backspace, Tab, Escape, Enter, etc
      this.navigationKeys.indexOf(e.key) > -1 || 
      (e.key === 'a' && e.ctrlKey === true) || // Allow: Ctrl+A
      (e.key === 'c' && e.ctrlKey === true) || // Allow: Ctrl+C
      (e.key === 'v' && e.ctrlKey === true) || // Allow: Ctrl+V
      (e.key === 'x' && e.ctrlKey === true) || // Allow: Ctrl+X
      (e.key === 'a' && e.metaKey === true) || // Cmd+A (Mac)
      (e.key === 'c' && e.metaKey === true) || // Cmd+C (Mac)
      (e.key === 'v' && e.metaKey === true) || // Cmd+V (Mac)
      (e.key === 'x' && e.metaKey === true) // Cmd+X (Mac)
    ) {
        return;  // let it happen, don't do anything
    }
    // Ensure that it is a number and stop the keypress
    if (e.key === ' ' || isNaN(Number(e.key))) {
      e.preventDefault();
    }
  }
}

번호 검증을 수행하는 가장 간단하고 효과적인 방법은 (공백과 특수 문자를 제한합니다.)

길이 제한을 원하지 않는다면 maxlength 속성을 제거할 수 있습니다.

HTML

<input type="text" maxlength="3" (keypress)="validateNo($event)"/>

TS

validateNo(e): boolean {
    const charCode = e.which ? e.which : e.keyCode;
    if (charCode > 31 && (charCode < 48 || charCode > 57)) {
      return false
    }
    return true
}

저도 비슷한 문제가 있었습니다: 저는 필요하지 않은 입력 필드에 숫자와 null을 원했습니다.여러 가지 다양한 변형을 통해 작업했습니다.나는 결국 이것을 결정했는데, 이것은 효과가 있는 것 같습니다.지시를 내리면,ntvFormValidity, 네이티브 유효성이 없고 무효 상태를 ng-invalid로 전환하지 않는 모든 폼 제어에서.

샘플 용도:<input type="number" formControlName="num" placeholder="0" ntvFormValidity>

지시 정의:

import { Directive, Host, Self, ElementRef, AfterViewInit } from '@angular/core';
import { FormControlName, FormControl, Validators } from '@angular/forms';

@Directive({
  selector: '[ntvFormValidity]'
})
export class NtvFormControlValidityDirective implements AfterViewInit {

  constructor(@Host() private cn: FormControlName, @Host() private el: ElementRef) { }

  /* 
  - Angular doesn't fire "change" events for invalid <input type="number">
  - We have to check the DOM object for browser native invalid state
  - Add custom validator that checks native invalidity
  */
  ngAfterViewInit() {
    var control: FormControl = this.cn.control;

    // Bridge native invalid to ng-invalid via Validators
    const ntvValidator = () => !this.el.nativeElement.validity.valid ? { error: "invalid" } : null;
    const v_fn = control.validator;

    control.setValidators(v_fn ? Validators.compose([v_fn, ntvValidator]) : ntvValidator);
    setTimeout(()=>control.updateValueAndValidity(), 0);
  }
}

과제는 폼 컨트롤에서 ElementRef를 가져와 검사할 수 있도록 하는 것이었습니다.@ViewChild가 있다는 것은 알지만, ID로 각 숫자 입력 필드에 주석을 달아서 다른 것으로 전달할 필요는 없었습니다.그래서 ElementRef를 요청할 수 있는 Directive를 만들었습니다.

사파리에서는 위의 HTML 예제에서 Angular는 "abc"와 같은 입력에서 폼 컨트롤이 유효하지 않음을 표시합니다.

이 작업을 다시 수행한다면 숫자 입력 필드에 대한 자체 CVA를 구축할 수 있을 것입니다. 이를 통해 더 많은 제어 기능을 제공하고 간단한 html을 만들 수 있을 것입니다.

이와 같은 것:

<my-input-number formControlName="num" placeholder="0">

폼 하는 더 및 : , 를 할 수 있을 것 providers선언문에 제 지침(및 이 답변)을 업데이트할 수 있도록 알려주시기 바랍니다.

이를 위한 가장 강력하고 일반적인 방법은 값이 숫자로 변환될 수 있는지 확인하는 것입니다.이 경우 검증자를 추가합니다.

numberValidator(control: FormControl) {
  if (isNaN(control?.value)) {
    return {
      number: true
    }
  }
  return null;
}

export class App {
  form: FormGroup = new FormGroup({});

  constructor(
    private fb: FormBuilder,
  ) {
    this.form = fb.group({
      number: ['', [numberValidator]]
    })
  }
 }

이를 Validators.min 및/또는 Validators.max와 결합하여 허용된 값을 더욱 제한할 수 있습니다.

가장 쉬운 방법은 이런 도서관을 사용하는 것일 것이고 특히 당신이 원하는.noStrings

    export class CustomValidator{   // Number only validation   
      static numeric(control: AbstractControl) {
        let val = control.value;

        const hasError = validate({val: val}, {val: {numericality: {noStrings: true}}});

        if (hasError) return null;

        return val;   
      } 
    }

최소 입력을 하고 0부터 9까지의 숫자만 허용합니다.Angular Cli에서 나는 이것이 효과가 있었습니다.

<input type="number" oninput="this.value=this.value.replace(/[^\d]/,'')"  min=0>

를 .src/app/shared/validation.tsAngular help에 따르면:

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

export default class Validation {
  numberValidator: ValidatorFn = (control: AbstractControl): ValidationErrors | null => {
    if (isNaN(control?.value)) {
      return {
        number: true
      }
    }
    return null;
  }
}

ints는 구성 요소에 가져오기를 추가합니다.

import Validation from 'src/app/shared/validation'

init shared class in 구성 요소:

valid: Validation = new Validation()

합니다.numberValidator.FormControl:

editDeviceForm = new FormGroup({
  number: new FormControl('', [Validators.required, this.valid.numberValidator]),
})

사용자 지정 검사기에서 정규식을 사용해야 합니다.예를 들어 입력 필드에 9자리만 허용하는 코드는 다음과 같습니다.

function ssnValidator(control: FormControl): {[key: string]: any} {
  const value: string = control.value || '';
  const valid = value.match(/^\d{9}$/);
  return valid ? null : {ssn: true};
}

여기에서 샘플 앱을 살펴봅니다.

https://github.com/Farata/angular2typescript/tree/master/Angular4/form-samples/src/app/reactive-validator

가끔은 이런 간단한 것을 시도하는 것이 더 쉽습니다.

validateNumber(control: FormControl): { [s: string]: boolean } {

  //revised to reflect null as an acceptable value 
  if (control.value === null) return null;

  // check to see if the control value is no a number
  if (isNaN(control.value)) {
    return { 'NaN': true };
  }

  return null; 
}

도움이 되길 바랍니다.

코멘트에 따라 업데이트 되었습니다. 당신은 이와 같이 검증자에게 전화해야 합니다.

number: new FormControl('',[this.validateNumber.bind(this)])

내가 하는 구성요소에 validator를 넣을 경우 bind(이것)가 필요합니다.

언급URL : https://stackoverflow.com/questions/45057907/input-type-number-only-numeric-value-validation

반응형