P.S.: Have you thought to wrap the call "numeric_in" by a PG_TRY/PG_CATCH instead of checking for correctness by yourself?
I though about it, but it is not possible. Every PG_TRY/CATCH must be finished by RETHROW. Only when you will open subtransaction and you are playing with resource manager, you can do it. It is pretty expensive.
You can see in our code lot of situation when some function returns true, false, "error message" instead raising a exception. I would not to refactor numericin function in this style. This function is in critical path of COPY FROM, and any more calls can decrease performance. And then I have to do these checks before calling.