The problem with the shift key can be fixed as follows :
var e = event || evt; // for trans-browser compatibility
var charCode = e.which || e.keyCode;
if (charCode > 31 && (charCode < 48 || charCode > 57))
if (e.shiftkey) return false;
The down side of this is that it efectively disables the numeric key pay because the Num Lock sets the shift key.
You probably need to extend the numeric character set tested for to include a decimal point . or , depending upon convention, the thousand marker , and + and - to detect signs and on occasions the currency symbols such as £$ etc