【问题标题】:How to check if a string is a natural number?如何检查字符串是否为自然数?
【发布时间】:2013-05-28 19:01:53
【问题描述】:

在javascript中,如何检查字符串是否为自然数(包括零)?

谢谢

例子:

'0' // ok
'1' // ok
'-1' // not ok
'-1.1' // not ok
'1.1' // not ok
'abc' // not ok

【问题讨论】:

  • 自然数不就是非负整数吗? Try parseInt? parseInt on Mozilla Developer Network
  • @kush : parseInt?它是否进行验证?
  • @kush Wikipedia(和我大学时代的一位大学教授)说自然数可能包括也可能不包括 0,并且总是排除负数。在 OP 的情况下,注意到所需的定义包括 0 (这确实是“非负整数”)。此外,parseInt 单独不起作用,因为 parseInt('1.1') 将返回 1(至少在 Chrome 中)。
  • 1.0 怎么样?根据你的定义,这是一个自然数吗?

标签: javascript parsing


【解决方案1】:

这是我的解决方案:

function isNaturalNumber(n) {
    n = n.toString(); // force the value incase it is not
    var n1 = Math.abs(n),
        n2 = parseInt(n, 10);
    return !isNaN(n1) && n2 === n1 && n1.toString() === n;
}

这里是演示:

var tests = [
        '0',
        '1',
        '-1',
        '-1.1',
        '1.1',
        '12abc123',
        '+42',
        '0xFF',
        '5e3'
    ];

function isNaturalNumber(n) {
    n = n.toString(); // force the value incase it is not
    var n1 = Math.abs(n),
        n2 = parseInt(n, 10);
    return !isNaN(n1) && n2 === n1 && n1.toString() === n;
}

console.log(tests.map(isNaturalNumber));

这是输出:

[真、真、假、假、假、假、假、假、假]

演示: http://jsfiddle.net/rlemon/zN6j3/1

注意:这不是一个真正的自然数,但是我理解 OP 不想要一个真正的自然数。这是实数自然数的解决方案:

function nat(n) {
    return n >= 0 && Math.floor(n) === +n;
}

http://jsfiddle.net/KJcKJ/

@BenjaminGruenbaum提供

【讨论】:

  • 我正在更新这个:它似乎在“+42”上失败了。该解决方案不是最优雅的,但很有效。
  • @Blender 老实说,我只会做n>=0 && Math.floor(n) === +n,这就是我认为的自然数 :) 它很短,而且它通过设计涵盖了所有边缘情况
  • @rlemon:您忘记了n2 之前的var 关键字。没有它,你将把 n2 变成全球性的。
  • Blender,见 n1 声明后的逗号。 n2 不是全局的。
  • @Dancrumb 我也不能,我已经相应地更新了我的答案。我认为 cmets 中的讨论可能让我对要求感到有些困惑。无论哪种方式,OP 都知道我的功能的警告并有替代方法。
【解决方案2】:

使用正则表达式

function isNaturalNumber (str) {
    var pattern = /^(0|([1-9]\d*))$/;
    return pattern.test(str);
}

该函数将返回truefalse,因此您可以根据它进行检查。

if(isNaturalNumber(number)){ 
   // Do something if the number is natural
}else{
   // Do something if it's not natural
}

来源:http://www.codingforums.com/showthread.php?t=148668

【讨论】:

  • 不适用于 +425e30xFF 或...长话短说:数字不仅仅是要解析的文本
  • 对,没必要,因为这不是 OP 的要求。
  • @ChrisB 当然可以。这些值满足自然数。您不应该只为示例编写代码
  • 我根据 OP 的明显需求提供答案,我不需要进一步满足任何要求。我希望保持简单和重点。如果您觉得我的回答不够充分,请发布答案。
  • 答案基于 OP 的 一些 需求。人们表示他们认为答案不足的方式是反对票,我今天已经投票了。用你自己的话来说,我不需要再满足任何东西,比如我自己的答案
【解决方案3】:

如果你有正则表达式恐惧症,你可以这样做:

function is_natural(s) {
    var n = parseInt(s, 10);

    return n >= 0 && n.toString() === s;
}

还有一些测试:

> is_natural('2')
true
> is_natural('2x')
false
> is_natural('2.0')
false
> is_natural('NaN')
false
> is_natural('0')
true
> is_natural(' 2')
false

【讨论】:

  • 令我惊讶的是有多少人不包括基数参数
  • 2.0 是否是自然数是一个有趣的哲学问题 :-)自然数?我不是数学家。)
  • @Pointy: 好吧,你可以证明小数点后面跟着一个无穷大的0串就是数字2,就像1后面跟着一个无穷大的串一样小数点后的 9 也是 2。
  • @Pointy 我也在想,基于 tracevipin 的答案下面的 cmets,以及 Wolfram defines natural numbers 作为正(或非负)整数的集合。由于2.0 不是整数,因此在技术上它不是自然数(尽管它等价于自然数之一)。
  • @ajp15243:小数点不会改变1.0所指的对象。按照同样的定义,你会认为1.01.00 不相等吗?一个有点相关(并且可能更强大)的证明将显示0.999... = 1,它具有a lengthy Wikipedia article
【解决方案4】:

你可以if(num.match(/^\d+$/)){ alert(num) }

【讨论】:

    【解决方案5】:

    你可以使用

    var inN = !!(+v === Math.abs(~~v) && v.length);
    

    最后一个测试确保'' 给出false

    请注意,它不适用于非常大的数字(例如 1e14

    【讨论】:

    • 好吧,parseFloat()parseInt() 都接受字符串数字部分末尾的垃圾,所以 parseFloat("12balloons") 返回 12
    • OP 没有说他想用“12balloons”做什么。
    • 你可以使用:isFinite(e) && Math.abs(Math.round(e)) == e
    • @dystroy: 12balloons 不是自然数,所以我假设该函数会为它返回false
    • 可能应该假设12balloons 在无效输入时也是可能的,因为 OP 将'abc' 作为“不正确”的示例。
    【解决方案6】:

    您可以使用正则表达式检查 int:

    var intRegex = /^\d+$/;
    if(intRegex.test(someNumber)) {
    alert('Natural');
    }
    

    【讨论】:

      【解决方案7】:
      function isNatural(num){
          var intNum = parseInt(num);
          var floatNum = parseFloat(num);
          return (intNum == floatNum) && intNum >=0;
      }
      

      【讨论】:

      • 2 == 2.0,因此您的函数将为'2.0' 返回true
      • @Blender 有人可能会争辩说2.0 应该是有效的,因为2 == 2.0 是一个事实。取决于OP想要什么。
      • @ajp15243 当然,但同时,请看我在此之前对 Blender 的评论。也许它应该是有效的。但你是对的,这取决于 OP“希望”有多严格
      • @Ian 就答案而言,是的,这绝对取决于 OP。对于这些答案/cmets/讨论所依据的数学定义,我很想知道像2.0 这样的数字是否被认为是一个实际的整数,或者仅仅相当于一个“单独的数字实体”的整数。我想在数学世界中存在分歧。也许是math.stackexchange.com的问题。
      • @Ian:整数是有理数的子集。 1.01 引用同一个对象,就像 00.0 都引用 0
      【解决方案8】:

      Number() 准确解析字符串输入。 (“12basdf”是 NaN,“+42”是 42,等等)。用它来检查它是否是一个数字。从那里,只需进行几次检查以确保输入符合您的其余条件。

      function isNatural(n) {
          if(/\./.test(n)) return false; //delete this line if you want n.0 to be true
          var num = Number(n);
          if(!num && num !== 0) return false;
          if(num < 0) return false;
          if(num != parseInt(num)) return false; //checks for any decimal digits
          return true;
      }
      

      【讨论】:

        【解决方案9】:
        function isNatural(n){
            return Math.abs(parseInt(+n)) -n === 0;
        }
        

        这对于 '1 dog'、'-1'、'' 或 '1.1' 返回 false,并返回 true

        对于非负整数或其字符串,包括'1.2345e12', 并且不是“1.2345e3”。

        【讨论】:

          【解决方案10】:

          我知道这个帖子有点老了,但我相信我已经找到了迄今为​​止最准确的解决方案:

          function isNat(n) {                // A natural number is...
            return n != null                 // ...a defined value,
                && n >= 0                    // ...nonnegative,
                && n != Infinity             // ...finite,
                && typeof n !== 'boolean'    // ...not a boolean,
                && !(n instanceof Array)     // ...not an array,
                && !(n instanceof Date)      // ...not a date,
                && Math.floor(n) === +n;     // ...and whole.
          }
          

          我的解决方案基本上是 @BenjaminGruenbaum 所做贡献的演变。

          为了支持我的准确性声明,我大大扩展了@rlemon 所做的测试,并将包括我自己在内的每个建议的解决方案都通过它们:

          http://jsfiddle.net/icylace/qY3FS/1/

          正如预期的那样,一些解决方案比其他解决方案更准确,但我的解决方案是唯一通过所有测试的解决方案。

          编辑:我更新了isNat() 以减少对鸭子打字的依赖,因此应该更加可靠。

          【讨论】:

            【解决方案11】:

            这就是我检查字符串是否为自然数(包括零!)的方式。

            var str = '0' // ok
            var str1 = '1' // ok
            var str2 = '-1' // not ok
            var str3 = '-1.1' // not ok
            var str4 = '1.1' // not ok
            var str5 = 'abc' // not ok
            
            console.log("is str natural number (including zeros): ", Number.isInteger(Number(str)) && Number(str) >= 0)
            console.log("is str1 natural number (including zeros): ", Number.isInteger(Number(str1)) && Number(str1) >= 0)
            console.log("is str2 natural number (including zeros): ", Number.isInteger(Number(str2)) && Number(str2) >= 0)
            console.log("is str3 natural number (including zeros): ", Number.isInteger(Number(str3)) && Number(str3) >= 0)
            console.log("is str4 natural number (including zeros): ", Number.isInteger(Number(str4)) && Number(str4) >= 0)
            console.log("is str5 natural number (including zeros): ", Number.isInteger(Number(str5)) && Number(str5) >= 0)

            【讨论】:

            • 自然数不包括0
            • "在 javascript 中,如何检查字符串是否为自然数(包括零)?"这是他的问题。
            • 抱歉,我错过了。恢复
            【解决方案12】:

            将字符串转换为数字,然后检查:

            function isNatural( s ) {
              var n = +s;
              return !isNaN(n) && n >= 0 && n === Math.floor(n);
            }
            

            【讨论】:

            • 在示例中,1.1 是“不行的”
            【解决方案13】:
            function isNatural(number){
                var regex=/^\d*$/;
                return regex.test( number );
            }
            

            【讨论】:

              【解决方案14】:

              使用/^\d+$/ 将匹配000。 所以用/^[1-9]\d*$|^0$/匹配正整数或者0就对了。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2017-11-28
                • 1970-01-01
                • 2011-11-27
                相关资源
                最近更新 更多