Trace
Trace

Reputation: 18859

Javascript numeric input (regex) validation rules

I'm a bit stuck here.
With regards to the input of accounting data, the analyst requested a specific set of rules on the input of decimal data in text boxes.
Since I have not studied regular expressions at this point, and because I have very strict deadlines to attend with each a lot of work, I request your help.

The rules are (on blur):

What I've done so far, but doesn't fulfill the requirements:
http://jsfiddle.net/NxFHL/1/

$('#test_rules.numeric').on('blur', function(){
    var myString = $('#test_rules.numeric').val(); 
    myString = parseFloat(myString.replace(/[^\d.-]/g, '')); 
    myString = toFixed(myString, 2); 
    console.log(myString); 
}); 

function toFixed(value, precision) {
    var power = Math.pow(10, precision || 0);
    return 

String(Math.round(value * power) / power);
}

The regular expression used doesn't work correctly as it only accepts dot, not comma.
Also I am not sure about how I should make it so that only the last separator stays (so that the thousands separator gets ignored).

Upvotes: 0

Views: 482

Answers (2)

hindmost
hindmost

Reputation: 7195

Try this function:

function parseInputNum(val) {
    var sep = val.lastIndexOf('.') > val.lastIndexOf(',')? '.' : ',';
    var arr = val.replace(new RegExp('[^\\d'+sep+']+', 'g'), '')
    .match(new RegExp('(\\d+(?:['+sep+']\\d+|))$'));
    return arr? arr[1].replace(/[,]/g, '.') : false;
}

Upvotes: 1

Casimir et Hippolyte
Casimir et Hippolyte

Reputation: 89547

You can use this pattern:

^(?:[1-9](?:[0-9]{0,2}(?:([.,])[0-9]{3})?(?:\1[0-9]{3})*|[0-9]*)|0)(?!\1)[.,][0-9]{2}$

This pattern will check numbers like:

123,45
12,45
0.45
123,456,789.12
1234.56
123.456.789,12

but not numbers like:

12.23.45,12
012,345,678,91
1234,567.89
123,456,78

To convert the string into a number you must remove the thousand delimiter before. This can easily be done since the delimiter (if present) is in the capturing group 1. You must probably too replace the , by the . if it is used as decimal separator.

Upvotes: 0

Related Questions