After stripping of leading and trailing currency symbols and spaces, you can use the following expression.
[1-9][0-9]{1,2}(,[0-9]{3})*(.[0-9]{2})+
That is
(
[1-9][0-9]{0,2} One to three digits, no leading zero, followed by
(,[0-9]{3})* a thousands separator and three digits, zero or more times,
| or
0 a leading zero.
)
(.[0-9]{2})? Optional a decimal point followed by exactly two digits.
Handling the currency symbol nicely is not the easiest thing because you have to avoid inputs with a leading and a trailing currency symbol. A solution would be using a look ahead assertion.
(?=$(([$€] ?)?[0-9,.]+|[0-9,.]+( ?[$€]))^)[$€ ]+<ExpressionFromAbove>[$€ ]+
This does the following.
(?= Positive look ahead assertion.
$ Anchor start of line.
( Begin options.
([$€] ?)? Optional leading currency symbol followed by an optional space
[0-9,.]+ and one or more digits, thousand separators, and decimal points
| or
[0-9,.]+ one or more digits, thousand separators, and decimal points
( ?[$€]) followed by an optional space and and a currency symbol.
) End options.
^ Anchor end of line.
)
[$€ ]+ Leading currency symbol and optional space.
<ExpressionFromAbove> Match the actual number.
[$€ ]+ Trailing optional space and currency symbol.
If you know, that the format is correct, strip out everything that is not a digit or a decimal point and parse it into a decimal (in C# this would be using Decimal.Parse()), or, if there is no suitable parsing method, just split at the decimal point, parse into to integers, and combine both numbers.