SavvyGoat SavvyGoat - 1 month ago 4
Javascript Question

Allowing only numbers and one decimal

Guys and gals i have this piece of JavaScript code that only allows for numbers and one decimal period. The problem i'm having is that when i tab over to my textbox controls it highlights the value but i have press backspace to erase then enter a number. That is an extra keystroke that i want to prevent.

Props to the guy who created it found ( and here is the code. I put this on keyUp event.

// Retrieve last key pressed. Works in IE and Netscape.
// Returns the numeric key code for the key pressed.
function getKey(e)
if (window.event)
return window.event.keyCode;
else if (e)
return e.which;
return null;
function restrictChars(e, obj)
var CHAR_AFTER_DP = 2; // number of decimal places
var validList = "0123456789."; // allowed characters in field
var key, keyChar;
key = getKey(e);
if (key == null) return true;
// control keys
// null, backspace, tab, carriage return, escape
if ( key==0 || key==8 || key==9 || key==13 || key==27 )
return true;
// get character
keyChar = String.fromCharCode(key);
// check valid characters
if (validList.indexOf(keyChar) != -1)
// check for existing decimal point
var dp = 0;
if( (dp = obj.value.indexOf( ".")) > -1)
if( keyChar == ".")
return false; // only one allowed
// room for more after decimal point?
if( obj.value.length - dp <= CHAR_AFTER_DP)
return true;
else return true;
// not a valid character
return false;


If you can't use an already stable and well-know library, you can try something like this:

document.write('<input id="inputField" onkeyup="run(this)" />');

function run(field) {
    setTimeout(function() {
        var regex = /\d*\.?\d?/g;
        field.value = regex.exec(field.value);
    }, 0);

I know it doesn't prevent the wrong char to appear, but it works.

PS: that setTimeout(..., 0) is a trick to execute the function after the value of the field has already been modified.