Sunil Bamal
Sunil Bamal

Reputation: 117

How implement regex for a textfield to allow one comma one dot at a time in Extjs

I am working on a textfield to make it allow only numbers with max one comma and one dot(max) at any occurrence. It can accept value like "9.8,8.6". It should not allow two or more dots or commas at a time.

I have tried below code but its not working.

this.regex = new RegExp('[\d,]\.?[\d,]*$');

Upvotes: 0

Views: 529

Answers (1)

The fourth bird
The fourth bird

Reputation: 163277

Your current pattern has a lot of optional parts. It would also allow for example a single comma.

If the max is only 1 comma and 1 dot per number before or after the comma, you could make it optional:

^(?:\d+(?:\.\d+)?|\.\d+)(?:,(?:\d+(?:\.\d+)?|\.\d+))*$
  • ^ Start of string
  • \d+ Match 1+ digits
  • (?:\.\d+)* Match 0+ times a dot and 1+ digits
  • (?: Non capturing group
    • ,\d+(?:\.\d+) match comma, 1+ digits and optionally a dot and 1+ digits
  • )? Close group and make it optional
  • $ End of string

Regex demo

Your code could look like (Note to double escape the backslashes)

this.regex = new RegExp('^(?:\\d+(?:\\.\\d+)?|\\.\\d+)(?:,(?:\\d+(?:\\.\\d+)?|\\.\\d+))*$');

let regex = new RegExp('^(?:\\d+(?:\\.\\d+)?|\\.\\d+)(?:,(?:\\d+(?:\\.\\d+)?|\\.\\d+))*$');

[
  "9.8,8.6",
  "9.8",
  "8.2,9",
  "5,9",
  "9.8,8.6,1.1",
  "1,8.6",
  "9.8,8.6,1.1",
  "8,8,8",
  "9.8,8,8",
  "1,1",
  "1,1,.1,1",
].forEach(s => {
  console.log(s + " ==> " + regex.test(s));
});

Upvotes: 1

Related Questions