Regex for allowing numbers without leading and ending 0 - regex

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.

Related

Regular expression for positive number with 2 decimals used for displaying money

I am looking for a regular expression for displaying numbers with 2 decimals for displaying money of various currencies in the world. This regex should only allow 1 dot or comma as a decimal separator. And only allow positive numbers and the numbers can't begin with a 0.
Goals:
Both dot and comma can be used as a decimal separator
The decimal separator can only be once in a number
Numbers can't begin with a zero
Only positive numbers allowed
Solution
My solution for this dilemma is the following:
^\d*[,.]\d{2}?$
Beware that this is the official regex solution, for Java this works:
^\\d*([,.]\\d{0,2})?$
Java automatically helps you if you set the DecimalFormatSymbols
Use setDecimalSeparator and setGroupingSeparator to set the decimal separator and the grouping separator.
Explanation
This: ^\\d* tells regex that a number needs to start with 0 to 9 and can be repeated 0 or more times.
This: [,.] tells regex that the next thing needs to be a dot or a comma
This: \\d{2}?$ tell regex that a number needs to start with 0 to 9 and needs to match exactly 2 times and that it's optional. The $ asserts this or checks it at the end of the line.
() grouping in regex.
Verification
https://regex101.com/r/tbdvrk/3
Regex for negative and positive decimals
^-?\\d*([,.]\\d{0,2})?$
Regex for integer
^[1-9]\d*$
This is with a condition for allowing nothing:
^$|^[1-9]\d*$
| means: OR and ^$ means: nothing, therefore ^$| means: nothing OR something else.
Regex for negative and positive integers
^$|^[-1-9]\d*$

Regex that does not allow zeros

I use this regex:
/^(?!0000)(?!0+(?:[.,]\d{1,2})?$)\d{1,4}(?:[.,]\d{1,2})?$/
It allows decimal numbers (. and , separators), with two digits after the separator. It does not allow zero values. What I want to do is to make it allow numbers like 0.1 and 0.09 etc... Here it's impossible to write any number starting with 0. I don't know how to do this. Any idea?
Thanks.
You can simplify your regex with just one negative lookahead:
/^(?![,.0]*$)\d{1,4}(?:[.,]\d{1,2})?$/gm
RegEx Demo
(?![,.0]*$) will prevent any input with just 0s, dots or commas in input.
Any regex based approach would be trivial to bypass. For example, they could use any of the following to evade your regex filter:
+0- Start with +
-0 - Start with -
0e0 - Scientific notation
1e-999 - Not real 0, but most likely will be one after conversion.
And any combination of methods above.
Long story short: regex wouldn't work here.
Try to cast your string to a number and reject if it equals to 0.
You should be able to do that in most languages, including JavaScript.
Since you mentioned JS/Angular, you may replace all , with . (in case the decimal separator is ,) and cast the string to a number to check if it is zero, and if it is, then use your simplified regex /^\d{1,4}(?:[.,]\d{1,2})?$/ that makes sure there are 1 to 4 digits in the whole part and 1 to 2 digits in the fractional part:
function check(str) {
str = str.replace(/,/g, ".");
if ( parseFloat(str) > 0 ) {
return /^\d{1,4}(?:\.\d{1,2})?$/.test(str);
}
return false;
}
console.log(check("0,00"));
console.log(check("0,09"));
console.log(check("900000"));
If you cannot access the code, adjust the negative lookahead like
^(?!0+(?:[.,]0+)?$)\d{1,4}(?:[.,]\d{1,2})?$
See the regex demo
The (?!0+(?:[.,]0+)?$) negative lookahead fails the match only if the string starts with 1 or more zeros, and then has an optional sequence of , or . followed with 1 or more zeros.
^ - start of a string
(?!0+(?:[.,]0+)?$) - reject the match if it matches a sequence of
0+ - 1 or more zeros
(?:[.,]0+)? - an optional sequence of . or , followed with 1 or more zeros
\d{1,4} - 1 to 4 digits
(?:[.,]\d{1,2})? - an optional sequence of:
[.,] - a . or ,
\d{1,2} - any 1 or 2 digits
$ - end of string.
The lookahead pattern may be reduced to (?!0*[.,]?0+$), since the consuming pattern will ensure the correct format is matched.

Decimal Regex Constraint Matching (Four digits before optional decimal point and two after)

I need to figure out how to make my regex allow match correctly each time I type a number/decimal point. I want to limit the number of digits before and after the decimal point, which isnt too hard but i cant figure out how to allow the decimal point to match as well.
1 - match
12 - match
1234 - match
12345 - wrong
1234. - match
1234.1 - match
1234.12 - match
1234.123 - wrong
Other matched numbers
12.12
1.0
123.99
Edit:
So I want a max of 4 numbers before the decimal place and two after. Also the decimal place is optional.
The tricky part is that I want it to fail if the fifth character isn't a decimal point.
You need to specify your constraints better; I'm assuming you want a maximum of 4 before the dot and 2 after:
/^\d{1,4}(\.\d{0,2})?$/
edit: I added beginning and end of string matchers. Should work as you want now
You can use the following regex to select only those words that consists of digits and satisfying your condition.
/(?<=^|\s)\d{1,4}(?:\.\d{0,2})?(?=\s|$)/g
Positive lookahead and lookbehind are used to make sure that a whitespace is around the number.
DEMO
Debuggex Demo
Something like this will help
r'^\d{1,4}(\.\d{0,2})?$'
As you must be aware, \d represents a digit, . for the decimal point and {min_required,max_required}. Be sure to test your regular expression prior to using them here.

regex for integer or floating point number with two decimals

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.

Regular expression for strict decimal numbers

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]+)?$