我希望与旧的VB6 IsNumeric()
函数在同一概念空间中存在某些东西吗?
JavaScript中的(内置)方式来检查字符串是否为有效数字
Just use isNaN()
, this will convert the string to a number and if get a valid number, will return false
...
isNaN("Alireza"); //return true
isNaN("123"); //return false
My solution:
// returns true for positive ints;
// no scientific notation, hexadecimals or floating point dots
var isPositiveInt = function(str) {
var result = true, chr;
for (var i = 0, n = str.length; i < n; i++) {
chr = str.charAt(i);
if ((chr < "0" || chr > "9") && chr != ",") { //not digit or thousands separator
result = false;
break;
};
if (i == 0 && (chr == "0" || chr == ",")) { //should not start with 0 or ,
result = false;
break;
};
};
return result;
};
You can add additional conditions inside the loop, to fit you particular needs.
PFB the working solution:
function(check){
check = check + "";
var isNumber = check.trim().length>0? !isNaN(check):false;
return isNumber;
}
对于TypeScript无效,因为:
declare function isNaN(number: number): boolean;
对于TypeScript,您可以使用:
/^\d+$/.test(key)
好吧,我正在使用我制作的这个...
到目前为止,它一直在工作:
function checkNumber(value) {
if ( value % 1 == 0 )
return true;
else
return false;
}
如果您发现任何问题,请告诉我。
为什么jQuery的实现不够好?
function isNumeric(a) {
var b = a && a.toString();
return !$.isArray(a) && b - parseFloat(b) + 1 >= 0;
};
迈克尔提出了类似的建议(尽管我在这里偷了“ user1691651-约翰”的变更版):
function isNumeric(num){
num = "" + num; //coerce num to be a string
return !isNaN(num) && !isNaN(parseFloat(num));
}
以下是最有可能性能较差但结果稳定的解决方案。这是jQuery 1.12.4实现和Michael的回答的矛盾之处,需要额外检查前导/后缀空格(因为Michael的版本对于前导/后缀空格的数字返回true):
function isNumeric(a) {
var str = a + "";
var b = a && a.toString();
return !$.isArray(a) && b - parseFloat(b) + 1 >= 0 &&
!/^\s+|\s+$/g.test(str) &&
!isNaN(str) && !isNaN(parseFloat(str));
};
不过,后一个版本具有两个新变量。通过执行以下操作,可以绕开其中之一:
function isNumeric(a) {
if ($.isArray(a)) return false;
var b = a && a.toString();
a = a + "";
return b - parseFloat(b) + 1 >= 0 &&
!/^\s+|\s+$/g.test(a) &&
!isNaN(a) && !isNaN(parseFloat(a));
};
除了手动测试我当前困境中遇到的几个用例之外,我还没有通过其他方法对其中的任何一个进行过测试,而这些都是非常标准的东西。这是“站在巨人的肩膀上”的情况。
引用:
isNaN(num)//如果变量不包含有效数字,则返回true
如果您需要检查前导/尾随空格(例如,当需要一定数量的数字时),并且需要输入例如“ 1111”而不是“ 111”或“ 111”,则并不完全正确输入。
更好地使用:
var num = /^\d+$/.test(num)
parseInt(),但是请注意,此函数在某种意义上有所不同,例如对于parseInt(“ 100px”)返回100。
我已经测试过,迈克尔的解决方案是最好的。投票给他上面的答案(在该页面上搜索“如果您确实要确保该字符串”以找到它)。本质上,他的答案是这样的:
function isNumeric(num){
num = "" + num; //coerce num to be a string
return !isNaN(num) && !isNaN(parseFloat(num));
}
它适用于每个测试用例,我在这里记录了这些内容:https : //jsfiddle.net/wggehvp9/5/
对于这些边缘情况,许多其他解决方案均失败:'',null,“”,true和[]。从理论上讲,您可以通过适当的错误处理来使用它们,例如:
return !isNaN(num);
要么
return (+num === +num);
对/ \ s /,null,“”,true,false,[](还有其他?)进行特殊处理
尝试isNan函数:
isNaN()函数确定一个值是否为非法数字(非数字)。
如果该值等于NaN,则此函数返回true。否则,它返回false。
此函数不同于Number特定Number.isNaN()方法。
全局isNaN()函数,将测试的值转换为Number,然后对其进行测试。
Number.isNan()不会将值转换为Number,并且对于任何非Number类型的值也不会返回true。
如果你真的想确保字符串只包含一个数字,任何数字(整数或浮点数),并准确一些,你不能使用parseInt()
/ parseFloat()
,Number()
或!isNaN()
自己。请注意,!isNaN()
实际上是true
在什么时候Number()
会返回数字,false
什么时候会返回NaN
,所以我将在其余的讨论中将其排除在外。
的问题parseFloat()
是,它会返回一个数字,如果字符串中包含任何数量,即使字符串不包含只和准确的数字:
parseFloat("2016-12-31") // returns 2016
parseFloat("1-1") // return 1
parseFloat("1.2.3") // returns 1.2
问题Number()
在于,如果传递的值根本不是数字,它将返回一个数字!
Number("") // returns 0
Number(" ") // returns 0
Number(" \u00A0 \t\n\r") // returns 0
滚动自己的正则表达式的问题在于,除非您创建了与浮点数匹配的确切正则表达式,否则Javascript会识别该正则表达式,否则您会错过某些情况,或者会发现一些本不应该的情况。即使您可以使用自己的正则表达式,为什么呢?有更简单的内置方法。
但是,事实证明Number()
(和isNaN()
)在每种情况下parseFloat()
都应该做正确的事情,在这种情况下,本不应该返回数字,反之亦然。因此,要确定一个字符串是否确实是唯一且仅是一个数字,请调用这两个函数并查看它们是否都返回true:
function isNumber(str) {
if (typeof str != "string") return false // we only process strings!
// could also coerce to string: str = ""+str
return !isNaN(str) && !isNaN(parseFloat(str))
}
您可以使用RegExp方式:
var num = "987238";
if(num.match(/^-{0,1}\d+$/)){
//valid integer (positive or negative)
}else if(num.match(/^\d+\.\d+$/)){
//valid float
}else{
//not valid number
}
You could make use of types, like with the flow library, to get static, compile time checking. Of course not terribly useful for user input.