How to validate numeric values which may contain dots or commas?
Asked Answered
B

7

78

I need a regular expression for validation two or one numbers then , or . and again two or one numbers.

So, these are valid inputs:

11,11  
11.11  
1.1  
1,1  
Bullate answered 28/3, 2011 at 10:6 Comment(1)
P
113
\d{1,2}[\,\.]{1}\d{1,2}

EDIT: update to meet the new requirements (comments) ;)
EDIT: remove unnecesary qtfier as per Bryan

^[0-9]{1,2}([,.][0-9]{1,2})?$
Psychologist answered 28/3, 2011 at 10:11 Comment(2)
I'm sorry I didn't specified but the ,. and the numbers after its are not required.1 or 11 is also valid.Bullate
^[0-9]{1,2}([,.]{1}[0-9]{1,2})?$ this will match 11 11,11 11.11 1.1 and it will not match 11. or 11.11.11. and its tested with perl altho it looks posix compliant to me so it should work with other regex enginesPsychologist
B
48

In order to represent a single digit in the form of a regular expression you can use either:

[0-9] or \d

In order to specify how many times the number appears you would add

[0-9]*: the star means there are zero or more digits

[0-9]{2}: {N} means N digits

[0-9]{0,2}: {N,M} N digits to M digits

Lets say I want to represent a number between 1 and 99 I would express it as such:

[0-9]{1,2} or \d{1,2}

Or lets say we were working with binary display, displaying a byte size, we would want our digits to be between 0 and 1 and length of a byte size, 8, so we would represent it as follows:

[0-1]{8} representation of a binary byte

Then if you want to add a , or a . symbol you would use:

\, or \. or you can use [.] or [,]

You can also state a selection between possible values as such

[.,] means either a dot or a comma symbol

And you just need to concatenate the pieces together, so in the case where you want to represent a 1 or 2 digit number followed by either a comma or a period and followed by two more digits you would express it as follows:

[0-9]{1,2}[.,]\d{1,2}

Also note that regular expression strings inside C++ strings must be double-back-slashed so every \ becomes \\

Bookmobile answered 19/7, 2015 at 14:54 Comment(0)
P
16

\d means a digit in most languages. You can also use [0-9] in all languages. For the "period or comma" use [\.,]. Depending on your language you may need more backslashes based on how you quote the expression. Ultimately, the regular expression engine needs to see a single backslash.

* means "zero-or-more", so \d* and [0-9]* mean "zero or more numbers". ? means "zero-or-one". Neither of those qualifiers means exactly one. Most languages also let you use {m,n} to mean "between m and n" (ie: {1,2} means "between 1 and 2")

Since the dot or comma and additional numbers are optional, you can put them in a group and use the ? quantifier to mean "zero-or-one" of that group.

Putting that all together you can use:

\d{1,2}([\.,][\d{1,2}])?

Meaning, one or two digits \d{1,2}, followed by zero-or-one of a group (...)? consisting of a dot or comma followed by one or two digits [\.,]\d{1,2}

Par answered 28/3, 2011 at 11:11 Comment(0)
L
15
\d{1,2}[,.]\d{1,2}

\d means a digit, the {1,2} part means 1 or 2 of the previous character (\d in this case) and the [,.] part means either a comma or dot.

Logomachy answered 28/3, 2011 at 10:13 Comment(1)
I'm sorry I didn't specified but the ,. and the numbers after its are not required.1 or 11 is also valid.Bullate
D
6

Shortest regexp I know (16 char)

^\d\d?[,.]\d\d?$

The ^ and $ means begin and end of input string (without this part 23.45 of string like 123.45 will be matched). The \d means digit, the \d? means optional digit, the [,.] means dot or comma. Working example (when you click on left menu> tools> code generator you can gen code for one of 9 popular languages like c#, js, php, java, ...) here.

[ // tests
  '11,11',      // valid
  '11.11',
  '1.1',
  '1,1',
  '111,1',      // nonvalid
  '11.111',
  '11-11',
  ',11',
  '11.',
  'a.11',
  '11,a',
].forEach(n=> console.log(`${n}\t valid: ${ /^\d\d?[,.]\d\d?$/.test(n) }`))
Dextrogyrate answered 30/12, 2018 at 16:50 Comment(0)
I
2

If you want to be very permissive, required only two final digits with comma or dot:

^([,.\d]+)([,.]\d{2})$
Illusory answered 22/4, 2016 at 2:19 Comment(0)
X
0

Here is the solution for any number of digits before and after delimiter:

\d*[,.]\d*
Xmas answered 18/4, 2023 at 17:46 Comment(0)

© 2022 - 2025 — McMap. All rights reserved.