在JavaScript中将整个String转换为Integer

drs*_*222 7 javascript string integer

我最近遇到了一段非常像这样的代码:

var nHours = parseInt(txtHours);
if( isNaN(nHours))  // Do something
else // Do something else with the value
Run Code Online (Sandbox Code Playgroud)

谁写了这个代码的开发人员的印象是,在nHours要么是完全匹配的整数txtHoursNaN.这个假设有几个问题.

首先,开发人员留下的radix参数意味着输入"09"将导致值0而不是9.这个问题可以通过添加基数来解决:

var nHours = parseInt(txtHours,10);
if( isNaN(nHours))  // Do something
else // Do something else with the value
Run Code Online (Sandbox Code Playgroud)

接下来,输入"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;
}
Run Code Online (Sandbox Code Playgroud)

这似乎涵盖了上述所有问题.有没有人知道这种技术有什么问题,或者更简单的方法来获得相同的结果?

Šim*_*das 4

在这里,这就是我想出的:

function integer(x) {
    if (typeof x !== "number" && typeof x !== "string" || x === "") {
        return NaN;
    } else {
        x = Number(x);
        return x === Math.floor(x) ? x : NaN;
    }
}
Run Code Online (Sandbox Code Playgroud)

(注意:我更新了此函数以防止出现空格字符串。请参见下文。)

这个想法是只接受类型为 Number 或 String 的参数(但不接受空字符串值)。然后完成到 Number 的转换(如果它是字符串),最后将其值与 Floor() 值进行比较,以确定该数字是否为整数。

integer(); // NaN
integer(""); // NaN
integer(null); // NaN
integer(true); // NaN
integer(false); // NaN
integer("1a"); // NaN
integer("1.3"); // NaN
integer(1.3); // NaN    
integer(7); // 7
Run Code Online (Sandbox Code Playgroud)

然而,NaN 值在这里被“误用”,因为浮点数和表示浮点数的字符串会导致 NaN,而这在技术上是不正确的。

另请注意,由于字符串转换为数字的方式,字符串参数可能有尾随或前导空格,或前导零:

integer("   3   "); // 3    
integer("0003"); // 3
Run Code Online (Sandbox Code Playgroud)

另一种方法...

如果输入值是字符串,则可以使用正则表达式。此正则表达式:/^\s*(\+|-)?\d+\s*$/将匹配表示整数的字符串。

功能更新!

function integer(x) {
    if ( typeof x === "string" && /^\s*(\+|-)?\d+\s*$/.test(x) ) {
        x = Number(x);
    }
    if ( typeof x === "number" ) {
        return x === Math.floor(x) ? x : NaN;
    }
    return NaN;
}
Run Code Online (Sandbox Code Playgroud)

这个版本的integer() 更加严格,因为它只允许遵循特定模式的字符串(使用正则表达式进行测试)。它产生与其他integer()函数相同的结果,除了它另外忽略所有空白字符串(正如@CMS所指出的)。

又更新了!

我注意到@Zecc的答案并稍微简化了代码......我想这也有效:

function integer(x) {
    if( /^\s*(\+|-)?\d+\s*$/.test(String(x)) ){
        return parseInt(x, 10);
    }
    return Number.NaN;
}  
Run Code Online (Sandbox Code Playgroud)

它可能不是最快的解决方案(就性能而言),但我喜欢它的简单性:)