Quiero permitir que el usuario ingrese un valor decimal con un máximo de 9 dígitos enteros y un máximo de 2 decimales después del punto. Pero también este valor puede ser negativo, con signo "-". Todo está bien, excepto este signo menos. Aunque sitios como "regexp.online" muestran que mi expresión regular está bien, no funciona en js+jquery. El signo menos falla la verificación. Ver:
$('[name="price"]').bind("change keyup input", function() { pricecheck = '^(\\-)?\\d{1,9}(\\.\\d{0,2})?$'; var regex = new RegExp(pricecheck, 'g'); if (!regex.test(this.value)) { console.log('not in regex'); this.value = this.value.slice(0, -1); } }); <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> <input name="price" style="height:20px;">Y violín - https://jsfiddle.net/obc6qptf/
Probé este "menos" sin barras invertidas: el mismo resultado. ¿Qué está mal?
Necesita usar una expresión regular que coincida con el primer dígito opcionalmente:
const regex = /^-?\d{0,9}(?:\b\.\d{0,2})?$/; Tenga en cuenta que el límite de palabra \b se usa para asegurarse de que . el separador no viene justo después de - , y si lo necesita, elimine \b del patrón.
Detalles :
^ - comienzo de la cadena-? - un - carácter (opcional)\d{0,9} - cero a nueve dígitos(?:\b\.\d{0,2})? - una secuencia opcional de\b - un límite de palabra para requerir un dígito (aquí) antes de .\. - un punto\d{0,2} - cero, uno o dos dígitos$ - final de la cadena.Vea la demostración de JavaScript:
$('[name="price"]').bind("change keyup input", function() { const regex = /^-?\d{0,9}(?:\b\.\d{0,2})?$/; if (!regex.test(this.value)) { this.value = this.value.slice(0, -1); } }); <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> <input name="price" style="height:20px;">