Mira, esto te lo digo por experiencia propia.
Primero que nada, usa el input tipo "number" para ingresar números, la gran mayoría de los navegadores lo entienden y es muy útil si el sitio que estás haciendo debe verse en tablets y móviles.
Si realmente quieres validar que el dato ingresado por el visitante es un número, hazlo DESPUÉS de que lo haya hecho y no mientras escribe el dato en sí. Créeme, te ahorrará muchos dolores de cabeza.
Por otro lado el evento onKeypress se ejecuta después de que la tecla fue soltada y el caracter ya se imprimió en la pantalla. Si es por eso, es mejor usar el evento onKeyup que se ejecuta antes de que el caracter sea agregado al input.
En mi caso, para validar que una cadena sea un número uso un par de prototipos que agrego al objeto string.
Código Javascript :
String.prototype.trim = function() { return this.replace(/^\s+|\s+$/g, ""); };
String.prototype.replaceComma = function() { return this.replace(/,/g, "."); };
String.prototype.isint = function() {
var regint = /^[\+|\-]*\d+$/;
return regint.test(this.trim());
};
String.prototype.isfloat = function() {
var regfloat = /^[\+|\-]*\d+[\.\d+]*$/;
return regfloat.test(this.trim().replaceComma());
};
trim() elimina los espacios por delante y por detrás de la cadena.
replaceComma() reemplaza la coma por el punto.
isint() devuelve true o false de acuerdo a si la cadena es un número entero positivo o negativo sin límite de tamaño.
isfloat() es lo mismo pero para tipos de números flotantes, no importa si el visitante escribió el punto o la coma como separador de decimales.
Lo que no hacen estas últimas funciones es devolverte un tipo entero o flotante, pero te sirve para estar seguro que la cadena de texto se puede convertir a cualquiera de los dos tipos.
Se usa así:
Código Javascript :
var valor = document.getElementById('id_del_input').value;
if (valor.isint() != true) {
alert('El valor debe ser un número');
} else {
var entero = parseInt(valor);
}
Saludos.