16

I need to create a function to allow numbers dot and comma. So anyone corrects the following function

function on(evt) {
  var theEvent = evt || window.event;
  var key = theEvent.keyCode || theEvent.which;
  key = String.fromCharCode( key );
  var regex = /[0-9]|\./;
  if( !regex.test(key) ) {
    theEvent.returnValue = false;
    if(theEvent.preventDefault) theEvent.preventDefault();
  }
}
Ajay2707
  • 5,690
  • 6
  • 40
  • 58
WVW
  • 221
  • 1
  • 2
  • 10

6 Answers6

46

Firstly your regex currently doesn't allow comma, which is your requirement.

Secondly, you haven't used any quantifier, so your regex will match only a single character - one of [0-9] or a dot. You need to use a quantifier.

Thirdly, instead of using pipe, you can move all characters inside the character class only.

Try using the below regex:

/^[0-9.,]+$/

Quantifier + is used to match 1 or more occurrence of the pattern.
^ and $ anchors match the beginning, and end of the string respectively.

Rohit Jain
  • 209,639
  • 45
  • 409
  • 525
7

No need for JavaScript:

<input type="text" pattern="[0-9.,]+" title="Please enter a valid decimal number." />

Modern browsers will handle this perfectly.

If you want to specifically allow commas as thousand separators and a single decimal point, try this:

... pattern="\d{1,2}(,\d{3})*(\.\d+)?" ...

Note that I am firmly against blocking user input. They should be able to type what they want, and then told if they enter something invalid.

Niet the Dark Absol
  • 320,036
  • 81
  • 464
  • 592
6

Your regex is incorrect.

var regex = /^[0-9.,]+$/;

Regex javascript, why dot and comma are matching for \

https://stackoverflow.com/tags/regex/info

Community
  • 1
  • 1
HIRA THAKUR
  • 17,189
  • 14
  • 56
  • 87
6

This is the best solution, in my opinion, covers more cases of inputs and allow floats.

     $( ".numerical" ).on('input', function() { 
                var value=$(this).val().replace(/[^0-9.,]*/g, '');
                value=value.replace(/\.{2,}/g, '.');
                value=value.replace(/\.,/g, ',');
                value=value.replace(/\,\./g, ',');
                value=value.replace(/\,{2,}/g, ',');
                value=value.replace(/\.[0-9]+\./g, '.');
                $(this).val(value)

        });
Martin
  • 1,282
  • 1
  • 15
  • 43
1

Sometimes /^[0-9.,]+$/ is not work If not, then you could do something like this:

/^(?:[\d-]*,?[\d-]*\.?[\d-]*|[\d-]*\.[\d-]*,[\d-]*)$/
Sanjib
  • 11
  • 1
0

The Regex that I made for numbers following format of COMMA9.2

Example

  1. 1,350.88
  2. 120.00
  3. 1,500,999.24
  4. 100
  5. 10000000

RegEx

^(\d+|\d{1,3},\d{3}|\d{1,3},\d{3},\d{3}|\d{1,3}(,\d{3})*|\d{1,3}(,\d{3})*\.\d+)$

Dov Benyomin Sohacheski
  • 7,133
  • 7
  • 38
  • 64
gaurav gupta
  • 151
  • 1
  • 3
  • 11