我希望在与旧的 VB6IsNumeric()
函数相同的概念空间中有一些东西?
如何检查字符串是否为有效数字?
2020 年 10 月 2 日:请注意,许多基本方法都充满了细微的错误(例如空格、隐式部分解析、基数、数组强制等),这里的许多答案都没有考虑到这些错误。以下实现可能对您有用,但请注意,它不适合小数点“ .
”以外的数字分隔符:
function isNumeric(str) {
if (typeof str != "string") return false // we only process strings!
return !isNaN(str) && // use type coercion to parse the _entirety_ of the string (`parseFloat` alone does not do this)...
!isNaN(parseFloat(str)) // ...and ensure strings of whitespace fail
}
要检查变量(包括字符串)是否是数字,请检查它是否不是数字:
无论变量内容是字符串还是数字,这都有效。
isNaN(num) // returns true if the variable does NOT contain a valid number
例子
isNaN(123) // false
isNaN('123') // false
isNaN('1e10000') // false (This translates to Infinity, which is a number)
isNaN('foo') // true
isNaN('10px') // true
isNaN('') // false
isNaN(' ') // false
isNaN(false) // false
当然,如果需要,您可以否定这一点。例如,要实现IsNumeric
您给出的示例:
function isNumeric(num){
return !isNaN(num)
}
要将包含数字的字符串转换为数字:
仅当字符串仅包含数字字符时才有效,否则返回NaN
.
+num // returns the numeric value of the string, or NaN
// if the string isn't purely numeric characters
例子
+'12' // 12
+'12.' // 12
+'12..' // NaN
+'.12' // 0.12
+'..12' // NaN
+'foo' // NaN
+'12px' // NaN
将字符串松散地转换为数字
用于将 '12px' 转换为 12,例如:
parseInt(num) // extracts a numeric value from the
// start of the string, or NaN.
例子
parseInt('12') // 12
parseInt('aaa') // NaN
parseInt('12px') // 12
parseInt('foo2') // NaN These last three may
parseInt('12a5') // 12 be different from what
parseInt('0x10') // 16 you expected to see.
浮动
请记住,与+num
, parseInt
(顾名思义)不同,它会通过切掉小数点后的所有内容将浮点数转换为整数(如果您parseInt()
因为这种行为而想使用,则最好使用另一种方法) :
+'12.345' // 12.345
parseInt(12.345) // 12
parseInt('12.345') // 12
空字符串
空字符串可能有点违反直觉。+num
将空字符串或带空格的字符串转换为零,并isNaN()
假设相同:
+'' // 0
+' ' // 0
isNaN('') // false
isNaN(' ') // false
但parseInt()
不同意:
parseInt('') // NaN
parseInt(' ') // NaN
如果你只是想检查一个字符串是否是一个整数(没有小数位),regex 是一个很好的方法。其他方法如isNaN
对于如此简单的事情来说太复杂了。
function isNumeric(value) {
return /^-?\d+$/.test(value);
}
console.log(isNumeric('abcd')); // false
console.log(isNumeric('123a')); // false
console.log(isNumeric('1')); // true
console.log(isNumeric('1234567890')); // true
console.log(isNumeric('-23')); // true
console.log(isNumeric(1234)); // true
console.log(isNumeric(1234n)); // true
console.log(isNumeric('123.4')); // false
console.log(isNumeric('')); // false
console.log(isNumeric(undefined)); // false
console.log(isNumeric(null)); // false
只允许正整数使用这个:
function isNumeric(value) {
return /^\d+$/.test(value);
}
console.log(isNumeric('123')); // true
console.log(isNumeric('-23')); // false
你可以采用 RegExp 方式:
var num = "987238";
if(num.match(/^-?\d+$/)){
//valid integer (positive or negative)
}else if(num.match(/^\d+\.\d+$/)){
//valid float
}else{
//not valid number
}
这个问题的公认答案有很多缺陷(正如其他几个用户所强调的那样)。这是在 javascript 中处理它的最简单且经过验证的方法之一:
function isNumeric(n) {
return !isNaN(parseFloat(n)) && isFinite(n);
}
下面是一些很好的测试用例:
console.log(isNumeric(12345678912345678912)); // true
console.log(isNumeric('2 ')); // true
console.log(isNumeric('-32.2 ')); // true
console.log(isNumeric(-32.2)); // true
console.log(isNumeric(undefined)); // false
// the accepted answer fails at these tests:
console.log(isNumeric('')); // false
console.log(isNumeric(null)); // false
console.log(isNumeric([])); // false
如果你真的想确保字符串只包含一个数字,任何数字(整数或浮点数),并准确一些,你不能使用parseInt()
/ parseFloat()
,Number()
或!isNaN()
自己。请注意,!isNaN()
实际上返回true
whenNumber()
将返回一个数字,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()
(and 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))
}