在JavaScript中验证十进制数字的最干净,最有效的方法是什么?
奖励积分:
测试用例:
01. IsNumeric('-1') => true 02. IsNumeric('-1.5') => true 03. IsNumeric('0') => true 04. IsNumeric('0.42') => true 05. IsNumeric('.42') => true 06. IsNumeric('99,999') => false 07. IsNumeric('0x89f') => false 08. IsNumeric('#abcdef') => false 09. IsNumeric('1.2.3') => false 10. IsNumeric('') => false 11. IsNumeric('blah') => false
@Joel的答案非常接近,但在以下情况下将失败:
// Whitespace strings: IsNumeric(' ') == true; IsNumeric('\t\t') == true; IsNumeric('\n\r') == true; // Number literals: IsNumeric(-1) == false; IsNumeric(0) == false; IsNumeric(1.1) == false; IsNumeric(8e5) == false;
前段时间,我必须实现一个IsNumeric函数,以查明变量是否包含数值, 无论其类型如何 ,它都可能是String包含数值(我还必须考虑指数符号等),Number对象,几乎任何东西都可以传递给该函数,我不能做任何类型假设,要注意类型强制(例如,+true == 1;但true不应视为"numeric")。
IsNumeric
String
Number
+true == 1;
true
"numeric"
分享通过的测试:
function isNumeric(n) { return !isNaN(parseFloat(n)) && isFinite(n); }
由于强制转换为数字,因此PS的行为令人困惑。在ES6中,Number.isNaN和Number.isFinite将解决这些问题。使用它们时请记住这一点。
这是jQuery现在的方式(2.2稳定):
isNumeric: function(obj) { var realStringObj = obj && obj.toString(); return !jQuery.isArray(obj) && (realStringObj - parseFloat(realStringObj) + 1) >= 0; }
更新 : Angular4.3:
export function isNumeric(value: any): boolean { return !isNaN(value - parseFloat(value)); }