Your "revised version":
^\s(\d*\.)?\d+$
says that a single space is required at the front, so it will only match if a single space is present.
You can get rounf that with "*" which says "zero of more of these":
^\s*(\d*\.)?\d+$
And you can modify it to allow brackets if you must:
^[\s\(]*(\d*\.)?\d+[\s\)]*$
But ... I'd use
string.Trim
to remove spaces from both ends, and then use
Double.TryParse
to convert the value to a number. If it works, great use the numeric version. If it fails, complain to the user! If he's silly enough to expect "(" to be part of a number, then that's his problem...
What I'd actually do is use a NumericUpDown for the input so he can't enter it wrong, but that's up to you ...