Я бы использовал это регулярное выражение:
^[1-9][0-9]{0,2}(?:[ ,]?\d{3})*(?:[,.]\d+)?$
Демо
Вот объяснение регулярного выражения:
^ from the start of the string
[1-9][0-9]{0,2} match 1 to 3 leading digits (first digit not zero)
(?:[ ,]?\d{3})* then match an optional thousands separator followed by 3 digits,
the entire quantity zero or more times
(?:[,.]\d+)? match an optional decimal component, using either , or . as the separator
$ end of the string