Electrons_Ahoy Electrons_Ahoy - 23 days ago 4x
Javascript Question

Is there a (built-in) way in JavaScript to check if a string is a valid number?

I'm hoping there's something in the same conceptual space as the old VB6 IsNumeric() function?

Dan Dan

To check if a variable (including a string) is a number, check if it is not a number:

This works regardless of whether the variable contains is a string or number.

isNaN(num)     // returns true if the variable does NOT contain a valid number


isNaN(123)       // false
isNaN('123')     // false
isNaN('1e10000') // false  (number is Infinity)
isNaN('foo')     // true
isNaN('10px')    // true

Of course, you can negate this if you need to. For example, to implement the IsNumeric example you gave:

function isNumeric(num){
    return !isNaN(num)

To convert a string containing a number into a number:

only works if the string only contains numeric characters, else it returns NaN.

+num              // returns the numeric value of the string, or NaN if the 
                  // string isn't purely numeric characters


+'12'             // 12
+'12.'            // 12
+'12..'           // Nan
+'.12'            // 0.12
+'..12'           // Nan
+'foo'            // NaN
+'12px'           // NaN

To convert a string loosely to a number

useful for converting '12px' to 12, for example.

parseInt(num)     // extracts a numeric value from the 
                  // start of the string, or NaN.


parseInt('12', 10)    // 12
parseInt('aaa', 10)   // NaN
parseInt('12px', 10)  // 12
parseInt('foo2', 10)  // NaN      These last two may be different
parseInt('12a5', 10)  // 12       from what you expected to see. 


Bear in mind that, unlike +num, parseInt (as the name suggests) will convert a float into an integer by chopping off everything following the decimal point (if you want to use parseInt() because of this behaviour, you're probably better off with Math.floor() instead):

parseInt(12.345, 10)   // 12
parseInt('12.345', 10) // 12
+'12.345'          // 12.345

Empty strings

Empty strings may be a little counter-intuitive. +num converts empty strings to zero, and isNaN() assumes the same:

+''                // 0
isNaN('')          // false

But parseInt() does not agree:

parseInt('', 10)       // NaN