views:

120

answers:

4

I'm using the following regexp to validate numbers in my javascript file:

var valid = (val.match(/^\d+$/));

It works fine for whole numbers like 100, 200, etc, however for things like 1.44, 4.11, etc, it returns false. How can I change it so numbers with a decimal are also accepted?

+3  A: 
var valid = (val.match(/^\d+(?:\.\d+)?$/));

Matches:

 1  : yes
 1.2: yes
-1.2: no
+1.2: no
  .2: no
 1. : no

var valid = (val.match(/^-?\d+(?:\.\d+)?$/));

Matches:

 1  : yes
 1.2: yes
-1.2: yes
+1.2: no
  .2: no
 1. : no

 var valid = (val.match(/^[-+]?\d+(?:\.\d+)?$/));

Matches:

 1  : yes
 1.2: yes
-1.2: yes
+1.2: yes
  .2: no
 1. : no

var valid = (val.match(/^[-+]?(?:\d*\.?\d+$/));

Matches:

 1  : yes
 1.2: yes
-1.2: yes
+1.2: yes
  .2: yes
 1. : no

var valid = (val.match(/^[-+]?(?:\d+\.?\d*|\.\d+)$/));

Matches:

 1  : yes
 1.2: yes
-1.2: yes
+1.2: yes
  .2: yes
 1. : yes
Senseful
+3  A: 

try this:

^[-+]?\d+(\.\d+)?$
hunter
"4." is technically a valid decimal number but this regex won't match that. You should make the `\d+` digits in the group optional.
John Feminella
A: 

If you want to accept decimals (including <1) and integers, with optional + or - signs, you could use valid=Number(val).

Or a regexp:

valid=/^[+\-]?(\.\d+|\d+(\.\d+)?)$/.test(val);
kennebec
+3  A: 

isNaN seems like a better solution to me.

> isNaN('1')
false
> isNaN('1a')
true
> isNaN('1.')
false
> isNaN('1.00')
false
> isNaN('1.03')
false
> isNaN('1.03a')
true
> isNaN('1.03.0')
true
seanmonstar
works perfectly fine with positive/negative too
seanmonstar