Friday, January 16, 2009

Checks if a given value is Number or not in Javascript

The other day I needed to check via javascript if the text entered in a textbox is a valid or not. I know I can use the built-in isNaN function, but wanted to make sure that would in work all the scenarios. So, I searched online, but I found a couple of examples on the web, but they were using regular expression to check. I am not sure why they are using regular expressions, when you have isNaN function.

I created a test function to make sure isNaN works in all the scenarios and found that it works for almost everything I tried except for three values, they are null, empty string and a string with just spaces. For these three inputs, it returns false but you really want it to return true since obviously they are not valid numbers. I wrote an helper function to get around that and the following page shows the helper method as well as the test function I wrote to validate this helper function:

// Checks if a given value is a valid number or not
// The argument could be any of the following:
// a) A number itself
// b) Number in quotes, i.e. number stored as string
// c) Number could be in scientific format
// d) An object

function isNumber(val)
  // we need to explicitly handle null values
  // because isNaN returns false when it should return true 
  if (null == val) return false;

  // if it is an empty string or a string with just spaces
  // isNaN returns false, but we really need it to return true
  // this expression will remove spaces if the given value is a string type
  if (typeof(val) == "string")
   val = val.replace(/\s*/g, "");
  if (val == "") return false;

  return !isNaN(val);

// test function to test the isNumber function
function isNumber_Test(val, expResult)

  var dblQuote = '';
  if (typeof(val) == "string")
   dblQuote = '"';

  var actResult = isNumber(val);

  var clr = 'green';
  if (actResult != expResult)
   clr = 'red';

  document.write('isNumber(' + dblQuote + val + dblQuote + ')');
  document.write('' + actResult + '');
  document.write('' + expResult + '');
By the way, I am using a Javascript utility called SyntaxHighlighter, to render this code. If you have not already used this utility, I would highly recommend you check it out.

Here are some test results of isNumber() function:

Test isNumber() Function

Expression Result Expected Result

Happy coding,