【发布时间】:2011-05-09 06:37:24
【问题描述】:
我最近遇到了一段很像这样的代码:
var nHours = parseInt(txtHours);
if( isNaN(nHours)) // Do something
else // Do something else with the value
编写此代码的开发人员认为nHours 可能是与txtHours 或NaN 完全匹配的整数。这个假设有几个问题。
首先,radix 参数左侧的开发人员表示"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;
}
这似乎涵盖了上述所有问题。有谁知道这种技术有什么问题,或者可能有更简单的方法来获得相同的结果?
【问题讨论】:
-
Number(txtHours)而不是number(txtHours) -
另外,还有一个约定是构造函数名大写,常规函数名不大写。我建议通过使用像
convertToInteger或toInteger这样的小写名称来遵守该约定。除此之外,该功能对我来说看起来很可靠。 -
ConvertToInteger(true)返回1,我认为这不是我们想要的行为。 -
似乎在这些值进入系统时进行一些输入验证可能是一种值得的方法。
标签: javascript string integer