Also note that it falls down on your 0x89f test, but that's because in many environments that's an okay way to define a number literal.
If you want to catch that specific scenario you could add an additional check. Simply trimming the string before the length check will handle this case. is Na N('blah') ""); // false $Numeric('-1'); // true $Numeric('-1.5'); // true $Numeric('0'); // true $Numeric('0.42'); // true $Numeric('.42'); // true $Numeric('0x89f'); // true (valid hexa number) $Numeric('99,999'); // false $Numeric('#abcdef'); // false $Numeric('1.2.3'); // false $Numeric(''); // false $Numeric('blah'); // false (because they are not actually part of the number as far as I concerned, they are separate operators): I needed this for a tokenizer, where sending the number to Java Script for evaluation wasn't an option...
We will use the intl-tel-input plugin for that purpose.
For US phone numbers I think this covers the bases for a lot of different ways that people might format the number, but is restrictive enough that they can't pass an unreasonable string.
If you using on input tag than this code will help you.
Therefore, despite the fact that it doesn't cover all possible formats of phone number in the world, you can use the regexp validator to test a phone number in your country.