如何在JavaScript中将字符串转换为整数?


当前回答

在我看来,没有答案涵盖所有边缘情况,因为解析浮点值会导致错误。

function parseInteger(value) {
    if(value === '') return NaN;
    const number = Number(value);
    return Number.isInteger(number) ? number : NaN;
}
parseInteger("4")            // 4
parseInteger("5aaa")         // NaN
parseInteger("4.33333")      // NaN
parseInteger("aaa");         // NaN

其他回答

函数doSth(){var a=document.getElementById('input').value;document.getElementById('number').innerHTML=toNumber(a)+1;}函数toNumber(str){return+str;}<input id=“input”type=“text”><input onclick=“doSth()”type=“submit”><span id=“number”></span>

确保获得有效整数的最安全方法:

let integer = (parseInt(value, 10) || 0);

示例:

// Example 1 - Invalid value:
let value = null;
let integer = (parseInt(value, 10) || 0);
// => integer = 0
// Example 2 - Valid value:
let value = "1230.42";
let integer = (parseInt(value, 10) || 0);
// => integer = 1230
// Example 3 - Invalid value:
let value = () => { return 412 };
let integer = (parseInt(value, 10) || 0);
// => integer = 0

在JavaScript中将字符串转换为数字有两种主要方法。一种方法是解析它,另一种方法则是将其类型更改为Number。其他答案中的所有技巧(例如,一元加号)都隐含地将字符串的类型强制为数字。您也可以使用Number函数显式地执行相同的操作。

正在分析

var parsed = parseInt("97", 10);

parseInt和parseFloat是用于将字符串解析为数字的两个函数。如果它碰到了一个无法识别的字符,解析将自动停止,这对于解析像“92px”这样的字符串很有用,但这也有点危险,因为它不会在错误输入时给你任何错误,相反,除非字符串以数字开头,否则你会得到NaN。忽略字符串开头的空白。下面是一个例子,说明它做了与您想要的不同的事情,并且没有给出任何出错的迹象:

var widgetsSold = parseInt("97,800", 10); // widgetsSold is now 97

最好总是将基数指定为第二个参数。在较旧的浏览器中,如果字符串以0开头,如果没有指定基数,它将被解释为八进制,这让很多人感到惊讶。如果未指定基数(例如0xff),则通过使字符串以0x开头来触发十六进制的行为。ECMAScript 5实际上改变了标准,因此,如果没有指定基数,现代浏览器在出现前导0时不再触发八进制。parseInt可以理解直到基36的基,在这种情况下,大写和小写字母都被视为等价的。

将字符串类型更改为数字

上面提到的所有其他不使用parseInt的技巧都涉及将字符串隐式强制转换为数字。我更喜欢明确地这样做,

var cast = Number("97");

这与解析方法的行为不同(尽管它仍然忽略空格)。它更严格:如果它不理解整个字符串,那么它将返回NaN,因此不能将其用于97px这样的字符串。由于您需要一个基本数而不是number包装器对象,请确保不要在number函数前面放置新的。

显然,转换为Number会给你一个可能是浮点数而不是整数的值,所以如果你想要一个整数,你需要修改它

var rounded = Math.floor(Number("97.654"));  // other options are Math.ceil, Math.round
var fixed = Number("97.654").toFixed(0); // rounded rather than truncated
var bitwised = Number("97.654")|0;  // do not use for large numbers

任何按位运算符(这里我做了一个按位或,但也可以像前面的答案或移位一样做双否定)都会将值转换为32位整数,其中大多数都会转换为有符号整数。请注意,这不会让您想要大整数。如果整数不能用32位表示,它将换行。

~~"3000000000.654" === -1294967296
// This is the same as
Number("3000000000.654")|0
"3000000000.654" >>> 0 === 3000000000 // unsigned right shift gives you an extra bit
"300000000000.654" >>> 0 === 3647256576 // but still fails with larger numbers

要正确处理较大的数字,应使用舍入方法

Math.floor("3000000000.654") === 3000000000
// This is the same as
Math.floor(Number("3000000000.654"))

请记住,强制理解指数表示法和无穷大,因此2e2是200而不是NaN,而解析方法则不是。

风俗

这两种方法都不太可能完全符合您的要求。例如,如果解析失败,通常我会希望抛出一个错误,并且我不需要对无限、指数或前导空格的支持。根据您的用例,有时编写自定义转换函数是有意义的。

始终检查Number或其中一个解析方法的输出是否为所需的数字类型。您几乎肯定希望使用isNaN来确保数字不是NaN(通常是发现解析失败的唯一方法)。

我们可以使用+(stringOfNumber)而不是parseInt(stringOfNumber)。

示例:+(“21”)返回int值为21,类似于parseInt(“21)。

我们也可以使用这个一元“+”运算符来解析浮点数。。。

对于C和JavaScript之间的绑定,我实际上需要将字符串“保存”为整数,因此我将字符串转换为整数值:

/*
    Examples:
        int2str( str2int("test") ) == "test" // true
        int2str( str2int("t€st") ) // "t¬st", because "€".charCodeAt(0) is 8364, will be AND'ed with 0xff
    Limitations:
        maximum 4 characters, so it fits into an integer
*/
function str2int(the_str) {
    var ret = 0;
    var len = the_str.length;
    if (len >= 1) ret += (the_str.charCodeAt(0) & 0xff) <<  0;
    if (len >= 2) ret += (the_str.charCodeAt(1) & 0xff) <<  8;
    if (len >= 3) ret += (the_str.charCodeAt(2) & 0xff) << 16;
    if (len >= 4) ret += (the_str.charCodeAt(3) & 0xff) << 24;
    return ret;
}

function int2str(the_int) {
    var tmp = [
        (the_int & 0x000000ff) >>  0,
        (the_int & 0x0000ff00) >>  8,
        (the_int & 0x00ff0000) >> 16,
        (the_int & 0xff000000) >> 24
    ];
    var ret = "";
    for (var i=0; i<4; i++) {
        if (tmp[i] == 0)
            break;
        ret += String.fromCharCode(tmp[i]);
    }
    return ret;
}