如何检查字符串是否为有效数字?

IT技术 javascript validation numeric
2021-01-26 07:39:07

我希望在与旧的 VB6IsNumeric()函数相同的概念空间中有一些东西

6个回答

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
检查某事物是否为数字的最快方法是“等于自我”检查:var n = 'a'; if (+n === +n) { // is number }它比最新版 Chrome 中的 isNaN 快约 3994%。在这里查看性能测试:jsperf.com/isnan-vs-typeof/5
2021-03-14 07:39:07
请注意 !isNaN(undefined) 返回 false。
2021-03-24 07:39:07
这完全是错误的 - 它是如何获得这么多赞成票的?您不能使用isNaN“检查变量是否不是数字”。“不是数字”与“IEEE-794 NaN”不同,这是isNaN测试的内容。特别是,至少在测试布尔值和空字符串时,这种用法会失败。请参阅developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...
2021-03-25 07:39:07
关于 parseInt 的一个非常重要的注意事项是它允许您指定一个基数以将字符串转换为 int。这是一个很大的问题,因为如果您不提供它,它会尝试为您猜测基数。因此,例如: parseInt("17") 结果为 17(十进制,10),但 parseInt("08") 结果为 0(八进制,8)。因此,除非您另有打算,否则最安全的做法是使用 parseInt(number, 10),明确指定 10 作为基数。
2021-03-26 07:39:07
** 警告** 这个答案是错误的。使用风险自负。例子:isNaN(1 + false + parseInt("1.do you trust your users?"))
2021-03-27 07:39:07

如果你只是想检查一个字符串是否是一个整数(没有小数位),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
这就是我要找的,相当于 php ctype_digit
2021-03-22 07:39:07
也许只是将“isNumeric”重命名为“hasOnlyDigits”。在许多情况下,这正是您正在寻找的支票。
2021-03-25 07:39:07
console.log(isNumeric('2e2'));
2021-03-28 07:39:07
稍微好一点..禁止来自阿拉伯语等语言的数字字符 /^[0-9]+$/.test(value)
2021-04-02 07:39:07
console.log(isNumeric('-1'));
2021-04-06 07:39:07

你可以采用 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
}
构建数字的方法比看起来要多得多(另一条评论中的十六进制数字只是一个示例),并且有许多数字可能不被认为是有效的(溢出类型、过于精确等)。此外,正则表达式比仅使用内置机制更慢且更复杂
2021-03-16 07:39:07
还应该匹配科学记数法... 1e10 等。
2021-03-25 07:39:07
这在十六进制数(例如 0x12)、没有前导零的浮点数(例如 .42)和负数上失败。
2021-03-30 07:39:07
在这种情况下,RegExp == bad
2021-04-05 07:39:07
@JoelCoehoorn Care 详细说明为什么 RegExp == 不好?对我来说似乎是一个有效的用例。
2021-04-05 07:39:07

这个问题的公认答案有很多缺陷(正如其他几个用户所强调的那样)。这是在 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
对于字符串Number.isNaN并且Number.isFinite不起作用,因为它们不会将字符串转换为数字。
2021-03-27 07:39:07
parseFloat对这个应用程序来说是不够的,因为当它遇到第一个不能被解析为数字的字符时,它会返回一个到目前为止解析过的有效数字。例如。parseFloat('1.1ea10') === 1.1.
2021-03-31 07:39:07
请注意,如果您使用 Number.isNan 和 Number.isFinite,这将不起作用。
2021-04-06 07:39:07

如果你真的想确保字符串只包含一个数字,任何数字(整数或浮点数),并准确一些,你不能使用parseInt()/ parseFloat()Number()!isNaN()自己。请注意,!isNaN()实际上返回truewhenNumber()将返回一个数字,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))
}
当字符串有前导或尾随空格时返回真。' 1''2 '并且' 3 '都返回真。
2021-03-16 07:39:07
在 return 语句中添加这样的东西可以解决这个问题: && !/^\s+|\s+$/g.test(str)
2021-03-29 07:39:07
@RuudLenders - 大多数人不会关心是否有尾随空格被剪掉以使字符串成为有效数字,因为它很容易在许多接口中意外放入额外的空格。
2021-04-01 07:39:07
如果数字字符串来自用户输入,情况就是如此。但我认为无论如何我都应该提到空格,因为我认为大多数需要isNumber功能的人都不会处理用户界面。此外,良好的数字输入不允许以空格开头。
2021-04-09 07:39:07