Estoy tratando de validar un campo de entrada: número usando la directiva. El propósito del campo es aceptar solo números entre 0-9 o un número decimal hasta 3 lugares decimales (los números serán positivos todo el tiempo sin ningún símbolo).
Como hay más de 30 campos del mismo tipo, se pensó en crear una directiva que evite que los usuarios ingresen caracteres innecesarios.
A continuación se muestra mi código para el mismo junto con una muestra de Stackblitz :
Directiva:
import { Directive, HostListener } from '@angular/core'; @Directive({ selector: '[validTestValue]' }) export class NumberDirective { @HostListener('keydown', ['$event']) @HostListener('input', ['$event']) onKeyDown(e) { const key = ['Backspace', 'Delete', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '.']; let check = key.includes(e.key) && /^\d{1,7}((.)|(.\d{0,3})?)$/.test(e.target.value); console.log(check) if (!check) { e.preventDefault(); } } }HTML:
<input type="number" validTestValue class="testInput-field text-center" /> <!--Same input fields are there many times in my code-->El problema con este código es que puedo ingresar el valor que deseaba, es decir, solo se aceptan dígitos y el punto decimal, pero surgen algunos otros problemas como los siguientes:
Creo que el problema está en tu regx
/^\d{1,7}((.)|(.\d{0,3})?)
esto permite de 1 a 7 dígitos ({1,7} coincide con el token anterior entre 1 y 7 veces, tantas veces como sea posible)
Esto es lo que estoy usando actualmente. Puede controlar cuántos puntos decimales se permiten en un campo
En archivo de plantilla
<input type="text" numbers-only="2" placeholder=""Según la solución de Dilshan, solo verificará la cantidad de dígitos después del decimal y tampoco validará espacios según su expresión regular. Estoy actualizando un poco la solución de Dilshan para cumplir con sus requisitos según tengo entendido.
REGEX: ^([\d]{0,7})((\.{1})([\d]{1,3})?)?$
HTML: <input type="text" validateNumber="7.3" />
Esta es la solución de Stackblitz para su referencia.
Espero que esto te ayude 😊.