A seguinte expressão funciona para tudo, exceto as vírgulas:
'^[-+]*[0-9,]*[.]*[0-9]+$'
Você pode verificar o posicionamento incorreto da vírgula com verificações adicionais, como:
not regexp_like(txt, '[-+]*,$') and not regexp_like(txt, [',,'])
'^[-+]*[0-9,]*[.]*[0-9]+$'
not regexp_like(txt, '[-+]*,$') and not regexp_like(txt, [',,'])