在JavaScript中将整个字符串转换为整数

我最近碰到了一段非常类似于这样的代码:

var nHours = parseInt(txtHours);
if( isNaN(nHours))  // Do something
else // Do something else with the value

编写此代码的开发人员的印象是, nHours可能是完全匹配txtHoursNaN的整数。 这个假设有几个错误。

首先,开发者离开了基数参数,这意味着输入"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;
}

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


在这里,我想到了这一点:

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

(注意:我更新了这个功能来保护空白字符串,参见下文。)

这个想法是只接受类型是数字或字符串(但不是空字符串值)的参数。 然后,转换为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

然而,NaN值在这里被“滥用”,因为浮点数和字符串代表浮点数导致NaN,这在技术上不是真实的。

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

integer("   3   "); // 3    
integer("0003"); // 3

另一种方法...

如果输入值是字符串,则可以使用正则表达式。 这个正则表达式: /^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;
}

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

再次更新!

我注意到@Zecc的答案并简化了一些代码......我猜这也适用:

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

它probaly不是最快的解决方案(在性能方面),但我喜欢它的简单:)


这是我的尝试:

function integer(x) {
    var n = parseFloat(x); // No need to check typeof x; parseFloat does it for us
    if(!isNaN(n) && /^s*(+|-)?d+s*$/.test(String(x))){
        return n;
    }
    return Number.NaN;
}

我不得不信任ŠimeVidas的正则表达式,尽管我会自己到达那里。

编辑 :我不知道有一个NaN全球。 我一直使用Number.NaN
活到老,学到老。


我的解决方案涉及一些便宜的技巧 它基于这样一个事实,即Javascript中的位运算符将其操作数转换为整数。

我不太确定代表整数的字符串是否可以工作,因此这里有两种不同的解决方案。

function integer (number) { 
  return ~~number == number ? ~~number : NaN; 
}

function integer (number) {
  return ~~number === number ? ~~number : NaN;
}

第一个将两个整数作为字符串工作,第二个不会。 按位不(〜)运算符将其操作数转换为整数。 此方法对于不能用整数的32位宽表示(-2147483647 .. 2147483647)表示的较大的整数失败。

链接地址: http://www.djcxy.com/p/48861.html

上一篇: Convert an entire String into an Integer in JavaScript

下一篇: Can GLSL output to two/multiple textures at the same time?