【问题标题】:How to check if a string contains a number in JavaScript?如何在 JavaScript 中检查字符串是否包含数字?
【发布时间】:2014-04-01 18:07:27
【问题描述】:

我不明白从 JavaScript 中的其他字符串中区分包含数字的字符串有多难。

Number('') 的计算结果为 0,而 '' 绝对不是人类的数字。

parseFloat 强制使用数字,但允许它们被任意文本尾随。

isNaN 对于空白字符串的计算结果为 false。

那么,根据一个简单而合理的定义,检查字符串是否为数字的编程函数是什么?

【问题讨论】:

  • "3 " 是否适合您?如果是这样,则链接问题的接受答案不正确。
  • 拒绝“3”是可行的。喜欢接受的可以先修剪一下。
  • 那些不适合 JS 数字的数字怎么办(例如“12345678901234567”)?
  • @dronus,如果你想要一个非常具体的答案,一些关于你从哪里得到这个号码以及你将如何使用它的上下文可能会有所帮助。

标签: javascript types


【解决方案1】:

如果 name 字符串仅包含数字或文本,无需惊慌,只需使用此 sn-p 即可。 试试下面。

var pattern = /^([^0-9]*)$/;
if(!YourNiceVariable.value.match(pattern))   {//it happen while Name Contains only Charectors.}

if(YourNiceVariable.value.match(pattern))   {//it happen while Name Contains only Numbers.}

【讨论】:

    【解决方案2】:

    通过使用下面的函数,我们可以测试一个javascript字符串是否包含一个数字。在上面的函数中代替 t,我们需要将我们的 javascript 字符串作为参数传递,然后函数将返回 true 或 false

    function hasNumbers(t)
    {
    var regex = /\d/g;
    return regex.test(t);
    }    
    

    【讨论】:

    • 通过使用上面的函数我们可以测试一个javascript字符串是否包含一个数字。在上面的函数中代替 t,我们需要将我们的 javscript 字符串作为参数传递,然后函数将返回 true 或 false。
    • 澄清:如果字符串包含至少1个数字,此函数将返回true,而不是仅包含数字
    • 在这两种情况下,上述函数都只返回true
    【解决方案3】:

    我们试试

    ""+(+n)===n
    

    它强制执行非常严格的数字规范方式。

    但是,这样的数字字符串可以由JS可靠的var n=''+some_number创建。

    因此,此解决方案将拒绝“.01”,并拒绝 JS 将用指数字符串化的所有简单数字,也拒绝 JS 将仅用尾数显示的所有指数表示。但只要我们保持在整数和低浮点数范围内,它就应该使用其他提供的数字。

    【讨论】:

      【解决方案4】:

      你总是可以这样做的:

      function isNumber(n)
      {
          if (n.trim().length === 0)
              return false;
          return !isNaN(n);
      }
      

      【讨论】:

      • 将评估 true 以获得所有更长的空白输入。
      • @dronus 你说得对,我没想到,做个修剪就解决了问题
      • !isNaN(s) 是我来的目的
      【解决方案5】:

      有这个简单的解决方案:

      var ok = parseFloat(s)==s;
      

      如果您需要将"2 " 视为不是数字,那么您可以使用这个:

      var ok = !!(+s==s && s.length && s.trim()==s);
      

      【讨论】:

      • 看起来不错...拒绝空字符串、拖尾字符串和空格字符串,接受非规范浮点数​​,如 '.0''0.0',甚至可以像 1e5 那样进行详细说明。酷!
      • 太累了。也许我还是放弃了这个解决方案。我还将发布我的“确切”解决方案,它强制执行数字的规范形式,这可能会产生问题,但在我的情况下应该没问题。
      【解决方案6】:

      如果你想要一些更复杂的格式,你可以使用正则表达式,如下所示:

      var pattern = /^(0|[1-9][0-9]{0,2}(?:(,[0-9]{3})*|[0-9]*))(\.[0-9]+){0,1}$/;
      

      Demo

      我在不久前回答另一个问题时创建了这个正则表达式 (see here)。这将检查它是否是一个至少有一个字符的数字,不能以 0 开头,除非它是 0(或 0.[othernumbers])。除非小数点后有数字,否则不能有小数,可能有也可能没有逗号..但如果有,则确保它们相隔 3 位等。如果您想允许负数,也可以在开头添加 -?数字...类似于:

      /^(-)?(0|[1-9][0-9]{0,2}(?:(,[0-9]{3})*|[0-9]*))(\.[0-9]+){0,1}$/;
      

      【讨论】:

      • 一种直接的解决方案,适用于人们希望允许的所有数字格式。另一方面,仅检查一个数字就相当复杂了...
      • 请注意,这将接受不适合 JS 编号的数字。这可能是可取的,也可能不是。
      • 而且它不接受负数。不过,这很容易解决。
      • 其实很多修复都是必要的,比如"-1e3"
      • 不是每个人都这样使用,.;世界上有些人以相反的方式做事。不是每个人都使用 3 位数字组。
      【解决方案7】:

      刚刚删除了一个非常简短、错误但可纠正的答案。我只能评论它,而且它非常酷!所以这里再次更正一下:

      n!=='' && +n==n'
      

      看起来不错。第一项消除了空字符串的情况,第二项强制对由字符串的数字解释创建的数字进行字符串解释以匹配字符串。由于字符串不为空,因此删除了任何可以容忍的字符,例如空格,因此我们检查它们是否存在。

      【讨论】:

      • 如果字符串只有空白字符,第二个==会通过。
      • 不适用于' '。这就是我删除答案的原因。
      • 啊......真是一团糟:-)
      • 这将由""+(+n)===n 更正。但是,这会强制执行非常规范的数字输入,例如。 '0.123' 可以,而 '.123' 会失败。
      【解决方案8】:

      这可能很疯狂,具体取决于字符串的长度,但您可以将其拆分为单个字符的数组,然后使用 isNaN 测试每个字符以确定它是否为数字。

      【讨论】:

        猜你喜欢
        • 2010-12-19
        • 1970-01-01
        • 2023-04-05
        • 1970-01-01
        • 2013-07-10
        相关资源
        最近更新 更多