Kode_12
Kode_12

Reputation: 4818

How can I use REGEX to test for currency formats

How can you create a regular expression that checks if a user input matches characters formally found in a currency syntax? (number, period/decimal place, comma, or dollar sign?).

The following can find all characters listed above except for the dollar sign, any idea how to properly structure this?

/([0-9.,])/g

Upvotes: 0

Views: 1413

Answers (4)

slim
slim

Reputation: 41253

You need to define what you want your regex to match, more formally than "matches characters formally found in a currency syntax". We don't know which currencies you're interested in. We don't know how strict you need it to be.

Maybe you'll come up with something like:

These elements must come in this order:

  • A currency symbol ('£', '€' or '$') (your requirement might specify more currencies)
  • 1 or more numeric digits
  • A period or a comma
  • Exactly two numeric digits

Once you have a specification like that, it's easy to translate into a regular expression:

[£€$]    // one of these chars.
\d+      // '+' means 'one or more'
[.,]    // '[]' means 'any one of these'. 
\d\d     // Two digits. Could also be written as '\d{2}'

Or concatenated together:

[£€$]\d+[.,]\d\d

If you've learned about escaping special characters like $ and ., you may be surprised not to see it done here. Within [], they lose their special meaning.

(There are dialects of regex -- check the documentation for whatever implementation you're using)

Your requirements may be different though. The example I've given doesn't match:

  • $ 12.00
  • $12
  • USD12
  • ¥200.00
  • 25¢
  • $0.00005
  • 20 μBTC
  • 44 dollars
  • £1/19/11¾d ("one pound, nineteen shillings and elevenpence three farthings")

Work out your requirement, then write your code to meet it.

Upvotes: 0

ARNDG2
ARNDG2

Reputation: 123

The regex I use for currency validation is as follows:

^(\$)?([1-9]{1}[0-9]{0,2})(\,\d{3})*(\.\d{2})?$|^(\$)?([1-9]{1}[0-9]{0,2})(\d{3})*(\.\d{2})?$|^(0)?(\.\d{2})?$|^(\$0)?(\.\d{2})?$|^$

RegExr is a great website for testing and reviewing these strings (perhaps you could make a regex string that's less of a beast!)

Upvotes: 2

Patrick Haugh
Patrick Haugh

Reputation: 61032

Are you just trying to test the characters? In that case

[0-9,.$]+

will suffice. Or are you testing for the format $1,123,123.12 with the correct placements of commas and everything?

In that case you would need something more like

(\$?\d{1,3}(?:,\d{3})*(?:.\d{2})?)

should do.

Upvotes: 0

dwaskowski
dwaskowski

Reputation: 425

you should set \ before special chars, also you should set star(0+) or plus(1+) for match full currency chars, for example:

/([0-9\.,]*)/g

or for real price how 200,00 where all time exist 2 symbols after comma:

/(([0-9]+)(\.|,)([0-9]){2})/g

Upvotes: -1

Related Questions