I want to have a regexp to validate DECIMAL numbers:
The valid DECIMAL numbers are :
+123
123
-123
+123.0000
+123,123.999
.0234
+1123,233,34
invalid DECIMAL numbers are :
+1233+
-1233_
+12.233.33
Is there any one who can help on this
This is better:
^[+\-]?\d+(,\d{3})*(\.\d*)?$
Plus or minus, optionally, followed by any number of digits, followed optionally by any number of ,123 sections, followed optionally by a decimal and some more digits, this will handle anything except numbers with a leading decimal.
^[+\-]?(\d+(,\d{3})*(\.\d*)?|\.\d+)$
Adding that other option allows numbers with a leading decimal, which MUST be followed by digits.
Depends on your regular expression support.
^([-+])?(\d+)?(\.\d+)?$
Optional + or -, numeric, optional ',' followed by more numerics.
Will also match the empty string unfortunately.
I think this is about the simplest you can get:
^[+-]?\d*\.?\d+$
Digits are always required after the decimal point. Taking advantage of this fact simplifies the problem.
Update: At first I didn't notice that you also need to handle commas. Here is a simple version that allows commas to the left of the decimal point. Each comma must have at least one digit before and after it, but other than that no rule is enforced (which seems to be the point of your example data). Actually, it requires two digits after the final comma.
^[+-]?(\d+(,\d)?)*\.?\d+$
This works for all:
+123
123
-123
+123.0000
+123,123.999
.0234
+1123,233,34
check the demo:
^[+\-]?(\d+(,?\d)*(\.\d*)?|\.\d+)$
Regex Demo
You can use this
^([-+] ?)?[0-9]+(,[0-9]+)?$
Related
I want to validate my currency field with regex. I want to allow the following pattern entries
1.23
1
.45
0.56
56.00
No comma should be allowed. I've tried \d+(\.\d\d) but it allows only first, fourth and fifth entries. \d+(?:\.\d\d+)? allows all but third one.
Use \d* instead of \d+ before the decimal to match zero or more digits. Also add anchors (^ and $) or else it will pass as long as there is any match available. This would also validate an empty string, so if necessary you can use a lookahead to make sure there is at least one digit:
^(?=.*\d)\d*(?:\.\d\d)?$
Regexes for floating-point numbers are a solved problem:
\d*\.?\d+
For at least two decimals:
(\d*\.\d)?\d+
To make it more comprehensible:
\d+|\d*\.\d{2,}
And for exactly two decimals:
\d+|\d*\.\d{2}
Depending on your language, don't forget to anchor the expression so that it must match the whole string.
I want except some numbers in different syntax and I am trying to find the best Regex for this task/match.
First some valid numbers:
0.01
0.2
0.38
45
165.6
52732.08
999999999.99
And here some invalid numbers:
.01
.2
.50
.85
45.
45.0
45.00
00045.0
124.60
000124.60
124,6
000053853.01
999.999.999,99
999999999,99
After several tests I have created the following Regex:
^[1-9]?\d{1,9}\.?\d{1,2}(?<!0)$
But I always struggling on the number: 000058723.01
Any ideas? Thanks.
You can use this regex:
^(?!0+\d)\d+(?:\.(?![1-9]*0+$)\d{1,2})?$
Or:
^(?:0+|[1-9]\d*)(?:\.(?![1-9]*0+$)\d{1,2})?$
RegEx Demo
Try this pattern:
^((?:0|[1-9]+)(?:\.(?:\d+?[1-9]|[1-9]))?)$
Demo
You accept four kinds of input:
A number with no decimal places and without leading zeroes: [1-9]\d*
Zero followed by a dot followed by digits (without trailing zeroes): 0\.\d*[1-9]
A decimal number without leading or trailing zeroes: [1-9]\d*\.\d*[1-9]
Zero: 0
Putting the four together:
^([1-9]\d*|0\.\d*[1-9]|[1-9]\d*\.\d*[1-9]|0)$
Here is a fixed version of your regex:
^(?!0{2,})\d+(?:\.\d{1,2}(?<!0))?$
Here, initial 2 or more zeros are not allowed with the lookahead (?!0{2,}), and the decimal part is made optional within a non-capturing group (?:\.\d{1,2}(?<!0))?.
See demo
In case you do not want to match 0, you can exclude this in the negative lookahead:
^(?!0{2,}|0$)\d+(?:\.\d{1,2}(?<!0))?$
^^
See Demo 2
A number with optional decimals is composed from two pieces: the integer part and the optional decimal part that starts with a dot.
The integer part is either zero (0) or a sequence of digits that start with 1..9 (no 0) and can continue with zero or more digits:
0|[1-9][0-9]*
If you need to impose an upper limit on the integer part's length then replace * with {,n} where n is the maximum allowed length minus 1.
The decimal part starts with a dot (.) followed by zero or more digits and followed by one of 1..9 (no 0 allowed at the end).
The expression is:
\.[0-9]*[1-9]
Now let's combine them:
^(0|[1-9][0-9]*)(\.[0-9]*[1-9])?$
What I added when I joined the pieces:
^ - match the start of the string; without this the regex matches 45.0 from 00045.0;
parentheses around the integer part because of the lower precedence of |;
parentheses around the decimal part, followed by ? to signal the entire decimal part is optional;
$ - match the end of the string to avoid matching 124.6 from 124.60.
Remarks
The above regex was designed to match your examples. However, please notice that most programming languages allow most or all of the numbers you put in the "invalid" section and use a dot (.) as decimal separator. And many languages provide library functions that are able to parse the numbers that use a comma (,) as decimal separator.
Numbers without integer part (.85), without digits after the dot (45.) ore with trailing zeros (45.0) are valid and are interpreted without ambiguity.
The only troublemaker is the leading zero (00045.0). For integer numbers, most of the times it is a signal that the number is represented in base 8 while for real numbers it is simply ignored.
If regex validation is ^\d{0,10}(\.\d{0,2})?$, then maximum two digits are required after decimal which is optional.
But it allows "100." also. since the user has not entered any digit after decimal, how to validate and make decimal digits required if dot is entered
If you want to require 2 digits after the decimal if a period is provided then make your regex look like:
/^\d{0,10}(\.\d{2,})?$/
\d{2,} means that a mininum of two numbers is required - followed by any number of digits (which is why the expression is open-ended, e.g. 2, - if you require two and only two digits than provide both a lower- and upper-bound: {2,2}
It should work
^\d{0,10}(\.\d\d?)?$
Online demo
I want to validate my currency field with regex. I want to allow the following pattern entries
1.23
1
.45
0.56
56.00
No comma should be allowed. I've tried \d+(\.\d\d) but it allows only first, fourth and fifth entries. \d+(?:\.\d\d+)? allows all but third one.
Use \d* instead of \d+ before the decimal to match zero or more digits. Also add anchors (^ and $) or else it will pass as long as there is any match available. This would also validate an empty string, so if necessary you can use a lookahead to make sure there is at least one digit:
^(?=.*\d)\d*(?:\.\d\d)?$
Regexes for floating-point numbers are a solved problem:
\d*\.?\d+
For at least two decimals:
(\d*\.\d)?\d+
To make it more comprehensible:
\d+|\d*\.\d{2,}
And for exactly two decimals:
\d+|\d*\.\d{2}
Depending on your language, don't forget to anchor the expression so that it must match the whole string.
I want users to be allowed to enter numbers, up to 3 digits before the decimal place, with an optional decimal place and a maximum of 2 digits after the optional decimal place.
I want it to match: 12, 123, 123.5, 123.55, 123.
I do not want it to match: abc, 1234, 123.555
What I have so far it:
^\d{0,3}(.?)\d{0,2}$
At the moment it is still matching 1234. I think I need to use the look behind operator somehow but I'm not sure how.
Thanks
Try this:
^\d{0,3}(?:\.\d{0,2})?$
Or better, to avoid just a .:
^(?:\d{1,3}(?:\.\d{0,2})?|\.\d{1,2})$
Specifically, note:
Escaping the dot, or it matches any character (except new lines), including more digits.
Made the whole decimal part optional, including the dot. That is - the decimal dot is not optional - it must be including if we are to match any digit from the decimal part.
Even if you have escaped the dot, ^\d{0,3}(\.?)\d{0,2}$ isn't correct. With the dot optional, it can match 12378: \d{0,3} matches 123, (\.?) doesn't match anything, and \d{0,2} matches 78.
Working example: http://rubular.com/r/OOw6Ucgdgq
What about this?
/^\d{0,2}(?:\d\.|\.\d|\d\.\d)?\d?$/
Maybe this (untested)
^(?=.*\d)\d{0,3}\.?(?<=\.)\d{0,2}$
Edit - the above is wrong.
#Kobi's answer is correct.
A lookahead could be added to his first version to insure a NOT just a dot or empty string.
^(?=.*\d)\d{0,3}(?:\.\d{0,2})?$
You have to put the combination of decimal point and the decimal numbers optional. In your regex, only the decimal number is optional. 1234 is accepted because 123 satisfy ^\d{0,3}, not existing decimal point satisfy (.?), and 4 satisfy \d{0,2}.
Kobi's answer provided you the corrected regex.