However, I would be tempted to allow the user to miss off trailing decimal digits when they enter the number
^ ( 0 ( \. ( 0[1-9] | [1-9]\d? ) ) ? | ( [1-9]\d{0,5} ( \. \d{1,2} )? ) ) $
and then have a separate routine that added .00 to the end of integers (except for 0) or added a 0 to the end of one-decimal-place numbers.
This saves a lot of time on data entry but with a consequent trade off in data accuracy.
If the wanted value is 2.09 and you insist on the user typing all digits, the data will be rejected if errors are made and 2.0 or 2.9 is entered with a digit missing; however nothing can be done is 250 is typed instead of 2050 etc.
If the input allows trailing digits to be omitted, then 2.09 miskeyed as 2.0 will be "corrected" to 2.00, and input miskeyed as 2.9 will be corrected to 2.90, introducing errors in the data.
This is a trade off you have to consider.
Will the user get annoyed if they have to type 10.00 over and over again, when typing just 10 would suffice? Or should you insist on all digits every time?
Remember, data entry format doesn't have to be the same as data display format.