Я думаю, вам лучше оставить регулярные выражения вне смеси.
Что я хотел бы сделать, это преобразовать значение в целое число и округлить десятичную дробь, а затем проверить, не отрицательно ли это. Я также проверил бы, является ли первый символ знаком доллара, и если это так, просто удалите его. Код был бы проще и более читабельным, чем IMO, и если кто-то введет 12.34512 или .1, система все равно будет работать.
//untested
$amount = "$0.12"
if( $amount && $amount[0] == '$' ) {
ltrim($amount, '$');
}
$int_amount = (int) $amount;
$int_amount = round($int_amount, 2);
if( $amount <= 0 ) {
//error
}
При этом я не знаю, есть ли у вас для использования regexp по какой-либо причине (например, если у вас есть функция проверки, которая принимает значение и regexp в качестве аргументов), но в случае, подобном Я думаю, что лучше быть либеральным в ценовом формате, чтобы не говорить пользователям, что они вводят «недействительную сумму», когда вводят 12 центов без начального нуля.