В проекте HTML5 определены:
Алгоритм санации значения выглядит следующим образом: Если значение элемента не является допустимым числом с плавающей запятой, тогда вместо него установите пустую строку.
Ссылка 1
Я полагаю, что вы использовали бы значение по умолчанию "0", чтобы убедиться, что поле оставлено нетронутым или если было введено что-то недопустимое, так как, кажется, нет очевидного способа разграничить их.
После прочтения спецификаций проверки и некоторого тестирования (в Opera 10.54) я пришел к выводу, что:
<input id="email" type="email" value="blah">
document.getElementById("email").validity.typeMismatch // True
Не работает на <input type="number">
. Не уверен, если он должен, или это работа в процессе. Однако свойство существует, хотя оно всегда возвращает False.
Подробнее 2
Вы также можете установить пользовательский метод проверки Ссылка 3