JavaScript - 测试是否为整数

15 浏览
0 Comments

JavaScript - 测试是否为整数

我有一个文本字段,允许用户输入他们的年龄。我正在尝试使用JavaScript在客户端对这个字段进行一些验证。我已经在服务器端进行了验证。然而,我似乎无法验证用户输入的是否是实际的整数。我目前正在尝试以下代码:

    function IsValidAge(value) {
        if (value.length == 0) {
            return false;
        }
        var intValue = parseInt(value);
        if (intValue == Number.NaN) {
            return false;
        }
        if (intValue <= 0)
        {
            return false;
        }
        return true;
    }

奇怪的是,我已经在文本框中输入了单个字符,如"b",但这个方法返回true。我如何确保用户只输入整数?

谢谢

0
0 Comments

JavaScript - 检查整数的测试

在实际的整数检查中,使用以下代码:

function isInt(value) { 
    return !isNaN(parseInt(value,10)) && (parseFloat(value,10) == parseInt(value,10)); 
}

许多整数检查的问题是它们对于1.0会返回false,但1.0是一个有效的整数。这个方法检查浮点数和整数解析的值是否相等,因此对于#.00它将返回true。

更新:

在评论中讨论了两个问题,我将添加到答案中以供未来读者参考:

- 首先,当解析使用逗号表示小数点的字符串值时,这个方法不起作用。(毫不奇怪,它怎么可能起作用呢?例如,在美国的"1,001"是一个整数,而在德国则不是。)

- 其次,自此答案编写以来,parseFloat和parseInt的行为在某些浏览器中发生了变化,并且不同浏览器间存在差异。ParseInt更加激进,会丢弃字符串中出现的字母。这对于获取数字很好,但对于验证来说则不太好。

我推荐并实践使用像Globalize.js这样的库来解析UI中的数值,而不是使用浏览器的实现,并且仅在已知的“以编程方式”提供的值(例如从XML文档解析的字符串)中使用原生调用。

据我所知,没有编程语言将1,2视为整数或任何单个数值。

是的,但在我的情况下,我正在使用isInt函数来验证外部输入。在一些使用逗号作为小数分隔符的国家,'1,2'是一个有效的数字。

是的,但我宁愿将其视为一个视觉问题而不是一个程序问题。尽管如此,我自己就住在这样一个国家,所以我可以理解你为什么要这样做...

这个方法在"09"上失败,因为parseInt将其视为八进制。

以下代码应该在上述情况下工作:

function isInt(value) { 
    return !isNaN(parseInt(value, 10)) && parseInt(value, 10) == parseFloat(value); 
}

新的浏览器已经取消了自动八进制的行为,然而,似乎这些方法也比以前的实现更容忍。我没有旧的浏览器来测试,但至少在最新的Chrome版本中,parseInt('1a')返回1。我不记得在IE7上是否能这样工作...另外,如果客户端数值数据处理的行为对我来说很重要,我通常使用像Globalize.js这样的库。

不要使用这个算法!它会告诉你`isInt('5a') == true`!

感谢以大写字母重复我的最后一条评论,但这不是一个算法(参见:[en.wikipedia.org/wiki/Algorithm](http://en.wikipedia.org/wiki/Algorithm)),它是一个利用环境中内置库的布尔逻辑测试。行为是由使用的具体parseInt和parseFloat算法的实现决定的。

首先,我承认算法这个术语是错误的(我在术语上有点懒惰)。而且,一般而言,我认为用大写字母说话是粗鲁的。然而,考虑到我的评论处于“折叠状态”,而且这似乎是一个相当严重的缺陷(并且这是第二高评分的答案),所以我想尽我所能使其可见。至于它是“由具体实现确定的”,如果任何一个实现是主要的浏览器,那就足够大多数的Web开发人员了:如果Chrome这样做,但IE和Firefox不这样做,那么你仍然不能使用它。

好吧,我会更新答案,以便任何查看它的人都清楚。我几乎使用了相同的方法,只是在原始值和转换值的`toString`方法上添加了一个测试:

var isint = function (a) { return ((parseInt(a) === parseFloat(a)) && (a.toString() === parseInt(a).toString())); }

更简单的方法:

function validateInt(i) {     
    var j = parseInt(i);     
    return !isNaN(j) && i.toString() === j.toString(); 
}

0
0 Comments

JavaScript - 测试是否为整数的问题

在上述代码中,使用了正则表达式来判断一个变量是否为整数。然而,该方法存在一些问题需要解决。

首先,如果用户输入的是一个非负整数以外的任何内容,代码将无法正确判断。同样,如果用户输入的是负整数,代码也无法正确判断。

此外,如果用户输入的是一个只有一个整数元素的数组,代码同样会返回true(intRegex.test( [42]))。

对于未来的访问者,这个答案在这个问题中有解释。

解决这个问题并不难。可以通过修改正则表达式来使其适用于负数。例如:var intRegex = /^-?\d+$/;

另外,对于字符串形式的正数,例如'00001234',代码同样会返回true。

然而,对于科学计数法表示的整数,例如2.4e6,代码将无法正确判断。

0
0 Comments

JavaScript中有一个函数isNaN(),用来判断一个值是否为NaN(Not a Number)。如果一个值是数字,那么isNaN()函数会返回false。然而,在代码中使用intValue == Number.NaN来判断一个值是否为NaN是错误的。这个错误的原因是,NaN是一个特殊的数值,它与任何其他值都不相等,包括它本身。因此,intValue == Number.NaN永远都是false,无法正确判断一个值是否为NaN。

为了解决这个问题,可以使用isNaN()函数来代替intValue == Number.NaN。这样,当判断一个值是否为NaN时,可以使用以下代码:

if(isNaN(intValue))

如果intValue是一个数字,那么isNaN()函数会返回false,否则会返回true。通过这种方式,可以正确地判断一个值是否为NaN。

总结起来,JavaScript中使用isNaN()函数来判断一个值是否为NaN,而不是使用intValue == Number.NaN。这个错误的原因是NaN与任何其他值都不相等,包括它本身。通过使用isNaN()函数,可以正确地判断一个值是否为NaN。

0