Regex to match currency value (with decimal 2 digits) but not 0 - regex

I want to match:
0.01
0.12
1.00
1.12
12.00
12.34
But not:
0
0.00
.00
.12
To get price value which can not be zero.
I have written this regex:
/(^\d{1,}\.\d{2}$)|(^\d{1,}$)/
But it matches:
0
0.00
which I want to eliminate.
I've also tried with exclusion rules like ^(?!0)(?!0\.00)\d{1,}\.\d{2}|\d+$ but no success.

You want to match a value with decimal 2 digits but not 0:
^(?![.0]*$)\d+\.\d{2}$
The negative lookahead checks, if the string does not consist of only 0 and .
\d+\.\d{2} assures the desired formatting: One or more digits followed by a . followed by 2 digits.
Test at regex101.com (also see explanation on the right side)
To also allow 1, 2.2 change the last part to \.\d{1,2} and make it optional:
^(?![.0]*$)\d+(?:\.\d{1,2})?$
Test at regex101.com

(?=.*?[1-9])(^\d+\.\d{2}$)|(?=.*?[1-9])(^\d{1,}$)
Try this.Just added (?=.*?[1-9]) to negate 0.See demo.
http://regex101.com/r/yA1jY6/1

You could try the below regex.
^(?!0(\.00)?$)\d+(?:\.\d{2})?$
DEMO
Negative lookahead at the start won't allow 0 or 0.00

Related

Regex Conditional validation

I have a input field, and I want to create a regex that only receive input value from 0.00 to 100.00(include both). I have created a regex check:
^1?\d{0,2}(\.\d{1,2})?$
But with this one, it not only accept values from 0.00 to 100.00 but also accept the input from 100.01 to 199.99.
How can I set a condition that if there are three digital before the dot, it can be only 100 and the decimals part is 00 or 0 only if having decimals?
So 100.00, 100.0 or 100 are the only accept for the values over 99.99 and the input between 100.01 to 199.99 is not pass.
Here are some passed input:
100
100.00
100.0
3
0
0.00
5.2
8.21
37.23
Here are some not passed:
40.323
100.50
101.50
199.99
40.
100.
This should work:
^((?:100(?:\.00?)?)|(?:\d\d?(?:\.\d\d?)?))$
It matches:
x
x.x
x.xx
xx
xx.x
xx.xx
100
100.0
100.00
You can get the match via directly match or with the first capturing group :)
P.S. BTW, #Ouroborus's solution (in comments) also works, and his solution unexpectedly having the exact same length as mine lol:
^(?=.)(100(\.0{1,2})?|\d{1,2}(\.\d{1,2})?)$
You can match 0 - 99 with 1 or 2 optional decimals or 100 with optional .0 or .00
^(?:\d\d?(?:\.\d\d?)?|100(?:\.00?)?)$
The pattern in parts:
^ Start of string
(?: Non capture group
\d\d? Match 1-2 digits
(?:\.\d\d?)? Optionally match . and 1-2 digits
| or
100(?:\.00?)? Match 100 or 100.0 or 100.00
) Close non capture group
$ End of string
Regex demo
Try this:
^(100(\.00?)?|\d\d?)(\.\d\d?)?$
See live demo.
Regex:
^ = start
(100|\d\d?) = literal 100 or 1 or 2 digits
(\.\d\d?)? = dot then 1 or 2 digits, all optional
$ = end

Currency regex in Angular

I need Help for currency regex in Angular.
I'm not really good at regex.
What I want is a regex that:
allows comma as digital-group-separator, but not in the beginning or the end.
allows only 2 digits rounded after decimal point.
allows only one decimal point and not in the beginning or the end.
not allows 0.00 or 0.
This is my regex:
(?=.*?\d)^\$?(([1-9]\d{0,2}(,\d{3})*)|\d+)?(\.\d{1,2})?$
but this regex allows 0.00
any one here please help thanks
Desired Outputs
Valid:
1,000.00
1000
0.01
24
1,234,000
11,222,245.22
Not Valid:
,000.00
,,,,,9
0
0.00
1,22,2,
1,000.
123,123,22
000,300.00
000300.00
000,123
000,000
00,000
0,000
You may use
/^(?![0,.]+$)(?:0|[1-9]\d{0,2}(?:,\d{3})*|[1-9]\d*)(?:\.\d{1,2})?$/
See the regex demo
Details
^ - start of string
(?![0.,]+$) - a negative lookahead that fails the match if there are one or more 0, , or . chars till end of string
(?:0|[1-9]\d{0,2}(?:,\d{3})*|[1-9]\d* - either of the three alternatives:
0 - zero
| or
[1-9]\d{0,2}(?:,\d{3})* - one to three digits with the first one being non-zero, and then 0 or more repetitions of a comma and then three digits
| - or
[1-9]\d* - 1+ digits with the first one being non-zero,
(?:\.\d{1,2})? - an optional sequence of a . and then 1 or 2 digits
$ - end of string.

RegEx for matching numbers from 0.00 to 50.00

How can I get an regex expression that allows:
0.00 to 50.00 and also comma as decimal separator so
0,00 to 50,00
I have gotten as far as ([0-5]{1})?([0-9]{1})([,][0-9]{1,2})?
but there are still situations in which it fails. I have searched on line but could not find the right answer.
ADDED:
A small change in requirements. Actually it should be from 0.01 to 50.00, and 0,01 to 50,00. (But with the answers below I think I managed to adapt the regex strings so this is also matched)
There is a regex for range generator here. Generated and played with it, came up with this
^(?:[1-4]?\d[.,]\d\d?|50[.,]00?)$
Added non capturing group, little modifications and ^ start / $ end anchor. See demo at regex101.
For optional decimal part, how about this: ^(?:[1-4]?\d(?:[.,]\d\d?)?|50(?:[.,]00?)?)$
This regex should cover almost all cases matching numbers from 0.00 to 50.00,
^(?=.)(?:(?:(?:0|[1-4]?\d)?(?:[,.]\d{1,2})?)|50(?:[.,]00?)?)$
Explanation:
^ - Start of string
(?=.) - Positive look ahead to avoid matching empty string
(?: - Start of first non-grouping pattern
(?: - Start of second non-grouping pattern
(?:0|[1-4]?\d)? - This matches whole number from 0 to 49 and this whole number could be absent
(?:[,.]\d{1,2})? - Matches a comma or dot followed by one or two digits and this decimal part can be absent
) - Closing of second non-grouping pattern
| - Alternation for number 50 case
50(?:[.,]00?)?) - Matches 50 followed by either comma or dot followed by 0 or 00 where decimal part is optional
) - Closing of first non-grouping pattern
$ - End of string
Regex Demo
Edit:
For discarding zero value numbers, you can just add a negative lookahead (?!0*[.,]?0*$) in current regex and use this regex,
^(?=.)(?!0*[.,]?0*$)(?:(?:(?:0|[1-4]?\d)?(?:[,.]\d{1,2})?)|50(?:[.,]00?)?)$
Regex Demo rejecting zero valued numbers
does this one work for you?
(50([.,]0{1,2})?)|([0-4]?[0-9]([.,][0-9]{1,2})?)

Regex for currency number, How can I write it shorter?

^((?=.*[1-9]|0)(?:\d{1,3}))((?=.*\d)(?:\.\d{3})?)*((?=.*\d)(?:\,\d\d){1}?){0,1}$
I actually think this regular expression is very long, and mayby could be shorter. The problem is i'm not very good with regular expressions and therefore I ask you for help.
Online regex tester http://regexr.com/3a3mk
My rules:
Starting with 1, 2 or 3 positive numbers [1-9] or 0.
Adding as many . (followed by 3 numbers [0-9]) as you want.
Possibility to add a comma with 2 numbers (as decimals)
Positive results
0
0,55
1
1,60
10
10,70
100
100,80
1,10
1.000
1.000,20
10.000
10.000,03
100.000
100.000,08
1.000.000.000
1.000.000.000,10
Negative results
0,0
1,1
1,000
1000.000
0.000
0.000,10
1.000,1
1.000,100
1.0,00
1.00,00
1.000,0
01
012,10
012.123,10
a
a0
0,a
0,aa
1.a00.00
1.000.a1
[EDIT] Added more negative results
The following should suit your needs:
^(?:0|[1-9]\d{0,2})(?:\.\d{3})*(?:,\d{2})?$
Visualization by Debuggex
Demo on regex101
Edited:
^(0|[1-9][0-9]{0,2}(\.[0-9]{3})*)(,[0-9]{2})?$
matches:
^ beginning of line
[1-9] just one non-zero digit
[0-9]{0,2} between 0 and 2 digits
(\.[0-9]{3})* zero or more lots of a period and 3 digits
(0 | [1-9][0-9]{0,2}(\.[0-9]{3})*) either (i) a zero or (ii) up to three digits (the first not a zero) followed by blocks of zero or more lots of a period followed by three digits
(,[0-9]{2})? zero or one lots of a comma and 2 digits
$ end of line
You'Re right, that your expression is a bit to long. A shorter version that works with the example numbers and specifications you gave would be this:
^(0|\d{1,3})(\.\d{3})*(,\d{2})?$
Explanation:
(0|\d{1,3}) checks for a 0 or 1 to 3 digits
(\.\d{3})*checks for a dot and 3 numbers, but because of *there can also be none of them
(,\d{2})? ckecks for a comma and two digits, but again it can appear once or not at all.
Hope it helps you!

Floating number regex between 0 and 1

I'm trying to validate input for floating number which max value is 1.0 and min value is 0.
Min : 0
Max : 1
Possible values ;
0.1
0.99
0.365
how can i succeed it with regex?
As javascript regex literal:
/^(0(\.\d+)?|1(\.0+)?)$/
0(\.\d+)?|1\.0
The explanation:
0 # a zero
(\.\d+)? # a dot and min 1 numeric digit - this is made optional by ?
| # or
1\.0 # one, a dot and a zero
If you need this to match the whole sring then you will need the caret and the dollar signs that represent beginning of string and end of string, respectively like in ^(0(\.\d+)?|1\.0)$
Also, if you want to look for possible negative numbers you will need to prepend an optional minus sign like in ^-?(0(\.\d+)?|1\.0)$. For exponentials the pattern needs to change, of course.
That's it:
/^(0+\.?|0*\.\d+|0*1(\.0*)?)$/
This worked for me:
0+([.][0-9]+)?|1([.]0)?
Or did I miss anything? :)
This RegEx should do just fine:
/((0(\.[0-9]*)?)|(1(\.0)?))/
Unless you plan on matching exponential form floating points.
This will match floats from [0,1] with an optional sign but will not match if scientific notation is used or the number starts with the decimal point.
\+?(0(\.[0-9]+)?|1(\.0+)?)
A general solution:
^0*(?:(?:0(?:\.\d*)?|\.\d+)|1(?:\.0*)?)$
Formatted:
^
0*
(?:
(?:
0
(?: \. \d* )?
| \. \d+
)
|
1
(?: \. 0* )?
)
$
^(?:(?<!\d*[1-9]\.?0*)(?:(?:0+(?:\.\d+)?)|(?:\.\d+)|(?:1(?!\.0*[1-9]+)(?:\.0+)?)))$
This will accept the numbers [0,1] in the following formatsĀ 
0
0.5
.5
1
1.0
1.000
Just read a brief about regex.
Hope this works !
^(0.0*[1-9](\d+)?)$
Let me know if i am missing something.