【问题标题】:Identify if a string has any non-integer characters, in JavaScript [duplicate]在JavaScript中识别字符串是否包含任何非整数字符[重复]
【发布时间】:2013-03-15 17:38:20
【问题描述】:

JavaScript parseInt() 的工作方式似乎与 Java parseInt() 不同。

一个非常简单的例子是:

document.write(parseInt(" 60 ") + "<br>");  //returns 60
document.write(parseInt("40 years") + "<br>");  //returns 40
document.write(parseInt("He was 40") + "<br>");  //returns NaN

第 1 行没问题。但我希望第 2 行会出错,因为您实际上无法将“年”转换为整数。我相信 JavaScript parseInt() 只是检查字符串中的前几个字符是否是整数。

那么我如何检查,只要字符串中有非整数,它就会返回 NaN?

【问题讨论】:

  • 为什么 Javascript parseInt 的行为与 Java parseInt 的行为相同,只是因为它们的名称相同?它们是两种完全不同语言的函数!
  • @Celada:JavaScript 行为类似于 Java 的期望是可以理解的,因为它们的名称相似。当然,这种相似性具有误导性。 JavaScript 不是从 Java 派生的。这个名字显然是出于营销原因而选择的。 Wikipedia JavaScript article 解释了这一点。

标签: javascript regex integer nan parseint


【解决方案1】:

parseInt 旨在为解析整数提供一定的灵活性。 Number 构造函数对额外字符不太灵活,但也会解析非整数(感谢 Alex):

console.log(Number(" 60 "));  // 60
console.log(Number("40 years"));  // Nan
console.log(Number("He was 40"));  // NaN
console.log(Number("1.24"));  // 1.24

或者,使用正则表达式。

" 60 ".match(/^[0-9 ]+$/);  // [" 60 "]
" 60 or whatever".match(/^[0-9 ]+$/);  // null
"1.24".match(/^[0-9 ]+$/);  // null

【讨论】:

  • 我不知道这是否重要,但仅供参考。 Number("1.23") 将得到 1.23,parseInt("1.23") 将仅得到 1,这可能很重要,也可能无关紧要
  • @Alex 很好。谢谢你提出来。
  • parseInt( Number("1.24") ) 应该给出所需的行为。如果你问我,那就太丑了。
  • @Alex 我考虑过。我不记得 Java 的 parseInt 是如何工作的——Java 中的 parseInt("1.24") 返回 1??
  • 我相信 java Integer.parseInt("1.24") 会返回 1,但我实际上并没有检查。我比正则表达式更喜欢 Number 方法,因为它还可以处理负数的“-”。
【解决方案2】:

要检查字符串是否包含非整数,请使用正则表达式:

function(myString) {
  if (myString.match(/^\d+$/) === null) {  // null if non-digits in string
    return NaN
  } else {
    return parseInt(myString.match(/^\d+$/))
  }
}

【讨论】:

    【解决方案3】:

    我会使用正则表达式,可能类似于以下内容。

    function parseIntStrict(stringValue) { 
        if ( /^[\d\s]+$/.test(stringValue) )  // allows for digits or whitespace
        {
            return parseInt(stringValue);
        }
        else
        {
            return NaN;
        }
    }
    

    【讨论】:

    • 好点,可以将它们添加到正则表达式中,但是有些字符串可能会漏掉。 Op 表示任何非整数字符,但仍然很好。
    【解决方案4】:

    最简单的方法可能是使用一元加号运算符:

    var n = +str;
    

    这也将解析浮点值。

    【讨论】:

      【解决方案5】:

      下面是一个isInteger函数,可以添加到所有String对象中:

      // If the isInteger function isn't already defined
      if (typeof String.prototype.isInteger == 'undefined') {
      
          // Returns false if any non-numeric characters (other than leading
          // or trailing whitespace, and a leading plus or minus sign) are found.
          //
          String.prototype.isInteger = function() {
              return !(this.replace(/^\s+|\s+$/g, '').replace(/^[-+]/, '').match(/\D/ ));
          }
      }
      
      '60'.isInteger()       // true
      '-60'.isInteger()      // true (leading minus sign is okay)
      '+60'.isInteger()      // true (leading plus sign is okay)
      ' 60 '.isInteger()     // true (whitespace at beginning or end is okay)
      
      'a60'.isInteger()      // false (has alphabetic characters)
      '60a'.isInteger()      // false (has alphabetic characters)
      '6.0'.isInteger()      // false (has a decimal point)
      ' 60 40 '.isInteger()  // false (whitespace in the middle is not okay)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-05-26
        • 2015-09-14
        • 2021-06-12
        • 2012-11-11
        • 1970-01-01
        • 1970-01-01
        • 2013-09-12
        • 2021-02-09
        相关资源
        最近更新 更多