После удаления начальных и конечных символов и пробелов валюты вы можете использовать следующее выражение.
[1-9][0-9]{1,2}(,[0-9]{3})*(.[0-9]{2})+
То есть
(
[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.
Хорошая обработка символа валюты - не самая простая вещь, потому что вы должны избегать вводов с начальным и конечным символом валюты. Решением будет использование прогнозного утверждения.
(?=$(([$€] ?)?[0-9,.]+|[0-9,.]+( ?[$€]))^)[$€ ]+<ExpressionFromAbove>[$€ ]+
Это делает следующее.
(?= 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.
Если вы знаете, что формат правильный, вычеркните все, что не является цифрой или десятичной запятой, и разберите его на десятичное число (в C # это будет использовать Decimal.Parse ()), или, если есть нет подходящего метода синтаксического анализа, просто разбить на десятичную точку, разобрать в целые числа и объединить оба числа.