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('
');
  document.write('isNumber(' + dblQuote + val + dblQuote + ')');
  document.write('' + actResult + '');
  document.write('' + expResult + '');
  document.write('
');
}
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,
Sonny

6 comments:

Balaji said...

Good Post.Probably helps for authentication purposes.Alternative for isNaN

Balaji said...

Good Post.Probably helps for authentication purposes.Alternative for isNaN

Jim Eric said...

Nice post.its useful for authentication purpose.An nice alternative for isNaN function.

Amr ElGarhy said...

Nice clean code and examples, thanks a lot for your help.

winter said...

it's not work with value: 1e1111 (if the second character is not a number)

Sonny Nallamilli said...

It does work when you call the isNumber function with 1e1111 or "1e1111" as the argument. Since it is a valid number it returns true, however, if you call it with "1f1111" it returns false.