我最近遇到了一段非常类似于此的代码:
var nHours = parseInt(txtHours);
if( isNaN(nHours)) // Do something
else // Do something else with the value
这段代码的开发者认为
nHours
应该是一个整数,它要么与txtHours
完全匹配,要么是NaN
。这个假设存在几个问题。首先,开发者没有加上基数参数,这意味着输入
"09"
会导致值为0
而不是9
。可以通过像这样添加基数来解决这个问题:var nHours = parseInt(txtHours,10);
if( isNaN(nHours)) // Do something
else // Do something else with the value
接下来,输入
"1.5"
将导致一个值为1
而不是开发人员预期的NaN
,因为1.5
不是整数。同样,值"1a"
将导致一个值为1
而不是NaN
。所有这些问题都有一定的可理解性,因为这是将字符串转换为整数的最常见示例之一,大多数地方都没有讨论这些情况。
无论如何,这让我想到了我不知道任何内置的方法来获得这样的整数。有
Number(txtHours)
(或+txtHours
),它更接近,但接受非整数数字,并将null
和""
视为0而不是NaN
。为了帮助开发人员,我提供了以下函数:
function ConvertToInteger(text)
{
var number = Math.floor(+text);
return text && number == text ? number : NaN;
}
这似乎涵盖了以上所有问题。有人知道这种技术存在什么问题,或者可能有一种更简单的方法来获得相同的结果吗?
convertToInteger
或toInteger
。除此之外,这个函数看起来对我来说非常稳定。 - Šime VidasConvertToInteger(true)
返回1
,这不是期望的行为,我想。 - Šime VidasMath.floor(+x)
处理边界情况与(x | 0)
相同,但是向零舍入的语义似乎比向下舍入更直观(对于熟悉C/Java浮点数转整型的人来说)。 - Mike Samuel