Tengo un campo de entrada type="number" . En keyup , necesito quitar todos los caracteres (incluido - ) excepto 0-9 . y , (no me importa el orden). Esto resulta sorprendentemente difícil: aún no he encontrado una respuesta.
Obtuve lo siguiente:
$input.on('keyup change', () => { $input.val($input.val().replace(/[^0-9\,\.]/,'')); }); La expresión regular es de este hilo ( Rails quita todo excepto las comas de números y los puntos decimales ), pero no funciona, si escribo 1. la entrada desaparece.
Parece que al menos en algunos navegadores (Edge) el valor del campo type="number" devuelve un valor desinfectado, lo que significa que lo que ve en la pantalla puede ser diferente de lo que ve javascript (por ejemplo, el valor para 99. será 99 (sin punto) ).
Además, estos campos no permiten cambiar la posición del cursor, lo que significa que si reemplaza su valor, el cursor siempre estará al final.
Debido a estas limitaciones, tal vez sea mejor que utilice la entrada de texto normal y la desinfecte manualmente dejando solo los caracteres que desee:
test.addEventListener("input", e => { let start = test.selectionStart; //remove invalid characters test.value = test.value.replace(/[^0-9,.]/g, (letter, index) => { if (index <= start) start--; return ""; }) //remove duplicate , and . .replace(/([,.])(.*)[,.]/g, (a, b, c, index) => { if (index <= start) start -= a.length - b.length - c.length; return b+c; }); test.selectionStart = test.selectionEnd = start; }); <input id="test">Considere usar Valor absoluto.
$(function() { $("#myNumber").on('keyup change', function(event) { $(this).val(Math.abs($(this).val())); }); }); <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> <input type="number" id="myNumber" min="0" />