如何检查一个字符串是否为自然数?

15

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

谢谢

示例:

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

自然数不就是非负整数吗?试试 parseInt? Mozilla 开发者网络上的 parseInt - kush
https://dev59.com/nlDTa4cB1Zd3GeqPHkTg - Harsha Venkataramu
@kush:有些人包含0,有些人则不包含。 - Blender
2
@kush 维基百科(以及我大学时代的一位教授)说自然数可能包括0,但总是不包括负数。在OP的情况下,所需定义被指定为包括0(这确实是“非负整数”)。此外,仅使用parseInt是行不通的,因为parseInt('1.1')将返回1(至少在Chrome中是这样)。 - ajp15243
6
1.0符合您的定义,是否属于自然数? - Blender
显示剩余4条评论
17个回答

25

这是我的解决方案:

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));

这是输出结果:

[true, true, false, false, false, false, false, false, false]

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

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

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

http://jsfiddle.net/KJcKJ/

@BenjaminGruenbaum提供


1
@Blender 说实话,我会写成 n>=0 && Math.floor(n) === +n,这就是我认为的自然数 :) 这样写很简洁,并且通过设计可以覆盖所有边缘情况。 - Benjamin Gruenbaum
@BenjaminGruenbaum,虽然你的定义更符合自然数的实际含义,但我认为它可能无法满足OP的要求。但另一方面,也许它会满足OP的要求,只是OP不知道呢? - rlemon
1
@rlemon:在n2之前你忘记了var关键字。没有它,你会使n2成为全局变量。 - Blender
2
Blender,注意n1声明后的逗号。n2不是全局变量。 - rlemon
1
@Dancrumb 我也不行,我已经相应地更新了我的答案。我认为评论中的讨论可能有点让我困惑了需求。无论如何,原帖作者知道我的函数的注意事项并有替代方案。 - rlemon
显示剩余12条评论

10

使用正则表达式

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

这篇文章讨论了如何在JavaScript中使用XMLHttpRequest对象来获取和处理服务器返回的数据。XMLHttpRequest是一个内置对象,可以向服务器发送请求并接收响应。本文提供了一些示例代码,演示了如何使用XMLHttpRequest对象从服务器获取数据,并将其插入到网页中。此外,本文还介绍了如何使用JSON格式来处理从服务器返回的数据。


4
无法处理+425e30xFF等内容。简而言之,数字比文本更难解析。 - Jan Turoň
1
没错,它不必这样做,因为那不是 OP 的要求。 - Chris Bier
1
@ChrisB 当然可以。这些值满足自然数的条件。你不应该只为例子编写代码。 - Ian
我根据提问者的明显需求提供了答案,我不需要满足任何其他要求。我希望保持简单明了。如果您认为我的答案不够充分,请发表您自己的答案。 - Chris Bier
答案基于OP的某些需求。人们表达答案不足的方式是通过负投票,而我今天已经用完了投票次数。用你自己的话来说,我不需要满足任何进一步的要求,比如我的回答。 - Ian
一行代码:/^\d+$/.test(number) - Kamil Kiełczewski

7
如果你对正则表达式感到害怕,你可以像这样做:
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

1
“2.0” 是否是自然数是一个有趣的哲学问题 :-) (一个数字是否可以完全等于自然数,但却不是自然数?我不是数学家。) - Pointy
@Pointy:嗯,你可以证明在小数点后面跟着无限个零的2是数字2,就像在小数点后面跟着无限个9的1也是2一样。 - Blender
@ajp15243:为什么它不是自然数?它既是整数,又大于0/1(取决于你如何定义自然数集)。 - Blender
@Blender,我刚刚看到了你的评论,说整数是有理数的子集。我认为这是一个简单的定义,我自己想不出来,它将它们联系在一起,因此1.0是一个整数,因此也是自然数。 - ajp15243
1
@ajp15243:小数点不会改变1.0所指的对象。按照同样的定义,你会认为1.01.00是不相等的吗?一个有点相关(而且可能更强的)证明是展示0.999...=1,这个在维基百科上有详细的文章 - Blender
显示剩余5条评论

2

您可以使用

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

最后一个测试确保''返回false
请注意,它不适用于非常大的数字(例如1e14)。

1
parseFloat()parseInt()都可以接受字符串中数值部分后面的垃圾字符,因此parseFloat("12balloons")返回12 - Pointy
1
OP并没有说明他想用"12balloons"做什么。 - Denys Séguret
2
@dystroy: 12balloons 不是自然数,因此我会认为该函数会返回 false - Blender
1
假设12balloons也是潜在的无效输入,因为OP给出了'abc'作为一个“不行”的例子。 - ajp15243
好的,已经对“12balloons”这个问题进行了编辑,希望楼主不要将事情看作是parseInt作者的错误。 - Denys Séguret
显示剩余3条评论

2
您可以使用以下代码来判断数字:if(num.match(/^\d+$/)){ alert(num) }

1
const func = (number) => {
    return Math.floor(number) === number
}

1
你可以使用正则表达式来检查 int 类型:

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

1
function isNatural(num){
    var intNum = parseInt(num);
    var floatNum = parseFloat(num);
    return (intNum == floatNum) && intNum >=0;
}

2
2 == 2.0,因此您的函数将为'2.0'返回true - Blender
@ajp15243 2.0 不是整数,因此不是自然数。 - Ian
1
@ajp15243 当然,但同时请看一下我之前对Blender的评论。也许它应该是有效的。但你说得对,这取决于OP希望这个有多严格。 - Ian
1
@Ian 就答案而言,是的,它肯定取决于 OP。对于许多这些答案/评论/讨论所基于的数学定义,我很想知道像 2.0 这样的数字是否被认为是实际整数,还是仅等同于一个“单独的数字实体”的整数。我想在数学界可能存在争议。也许可以在 http://math.stackexchange.com/ 上提出这个问题。 - ajp15243
1
@Ian:整数是有理数的子集。1.01指的是同一个对象,就像00.0都指向0一样。 - Blender
显示剩余6条评论

1

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;
}

1
function isNatural(n){
    return Math.abs(parseInt(+n)) -n === 0;
}

对于'1 dog','-1',''或'1.1',返回false,对于非负整数或其字符串(包括'1.2345e12',但不包括'1.2345e3'),返回true。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接