Necesito establecer un límite para el número de entrada total en 3. Por ejemplo, el usuario puede ingresar 333 , 123 , etc. Sin embargo, si usan el punto decimal, podrán ingresar 2 dígitos después del punto decimal. Entonces, estas entradas son válidas:
123
123.33
Aquí está el código que he escrito hasta ahora:
isNumber (event, message) { // preventing multiple decimal if (!/\d/.test(event.key) && (event.key !== '.' || /\./.test(message))) { return event.preventDefault() } // limiting three numbers before decimal point and two digits after decimal point if (/^(\d{0,3}\.)?\d{1,2}$/.test(message)) return event.preventDefault() } Pero, esta expresión regular, /^(\d{0,3}\.)?\d{1,2}$/ no funciona para mi caso
Puede considerar usar una entrada de número ( <input type="number"> ), con una propiedad max para controlar la cantidad de dígitos y un pequeño controlador de teclado para controlar el valor.
document.addEventListener('keyup', handle); function handle(evt) { if (evt.target.id === `num`) { if (evt.key === `Backspace`) { return true; } const [number, int] = [parseFloat(evt.target.value), parseInt(evt.target.value)]; evt.target.value = number > evt.target.max ? evt.target.max : number === int ? int : number.toFixed(2); document.querySelector(`#value`).textContent = `current value: ${evt.target.value}`; } } <input id="num" type="number" step="0.1" max="999.99"> <div id="value"></div>Puede usar la siguiente expresión regular:
^\d{0,3}(?:\.\d{1,2})?$ Lo que hay que recordar es hacer la parte fraccionaria, incluido el . , opcional.