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

2363

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


5
这个页面底部有一张非常好的表格,比较了不同的转换方法:https://medium.com/@nikjohn/cast-to-number-in-javascript-using-the-unary-operator-f4ca67c792ce - John Gilmer
1
在没有提问者的澄清下,这个问题可以被解释为将任何字符串转换为数字,即将“dog”转换为数字(当然可以做到)。 - Daniel Carrera
1
上钩了:@DanielCarrera...然而,这里没有人以那种方式解释问题。可能是因为如果那是目标,它很可能会用不同的措辞表达。毕竟,这样做的过程(“哈希”)从来没有被称为“转换为整数”,至少在我所知道的范围内是这样的。 - ToolmakerSteve
对于非标准区域设置(例如,在fr-FR中,123456789.123123 456 789,12请参见此讨论 - vsync
要解析不同数字系统(例如波斯/法尔斯或阿拉伯语),请参见此帖子此帖子 - Mahozad
32个回答

7

我实际上需要将一个字符串“保存”为整数,用于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;
}

5
这是一种有趣的存储和检索4字节值的方式。它没有回答传统意义上的问题:如何将数字的字符串表示转化为整数值。无论如何,你的 int2str 函数会停止,如果一个字节是0,这可能是值中的合法元素,因此应该删除 if ...break 以便返回完整的4字节值。 - Suncat2000

5
function parseIntSmarter(str) {
    // ParseInt is bad because it returns 22 for "22thisendsintext"
    // Number() is returns NaN if it ends in non-numbers, but it returns 0 for empty or whitespace strings.
    return isNaN(Number(str)) ? NaN : parseInt(str, 10);
}

然而,请注意 Number 支持一些特殊格式,这些格式 parseInt 会错误地解释。例如,Number("0x11") => 17,然后 parseInt 将返回 0。如果目标是拒绝所有非整数,则最好搜索非数字。或者可以执行 var f = Number(str); return f.isInteger() ? f : NaN; 根据您想要允许/拒绝的内容来决定。 - ToolmakerSteve

4

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

最初的回答:

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

3

Number()

Number(" 200.12 ")  // Returns 200.12

Number("200.12")  // Returns 200.12

Number("200") // Returns 200

parseInt()

parseInt(" 200.12 ")  // Return 200

parseInt("200.12")  // Return 200

parseInt("200") // Return 200

parseInt("Text information") // Returns NaN

parseFloat()

这个函数会返回第一个数字。

parseFloat("200 400")  // Returns 200

parseFloat("200") // Returns 200

parseFloat("Text information") // Returns NaN

parseFloat("200.10")  // Return 200.10

Math.floor()

将一个数字向下取整到最接近的整数

Math.floor(" 200.12 ")  // Return 200

Math.floor("200.12")  // Return 200

Math.floor("200") // Return 200

3
您可以使用加号。 例如:
var personAge = '24';
var personAge1 = (+personAge)

然后,您可以通过typeof personAge1查看新变量的类型; 它是 number 类型。


请问您能否解释一下在这种情况下 + 的作用以及如何进行强制类型转换? - Dilip Agheda

3

将数字乘以相应的十的幂次方后相加:

例如:123 = 100+20+3 = 1100 + 2+10 + 31 = 1*(10^2) + 2*(10^1) + 3*(10^0)

function atoi(array) {

    // Use exp as (length - i), other option would be
    // to reverse the array.
    // Multiply a[i] * 10^(exp) and sum

    let sum = 0;

    for (let i = 0; i < array.length; i++) {
        let exp = array.length - (i+1);
        let value = array[i] * Math.pow(10, exp);
        sum += value;
    }

    return sum;
}

1

另一种选项是将值与自身进行双重异或:

var i = 12.34;
console.log('i = ' + i);
console.log('i ⊕ i ⊕ i = ' + (i ^ i ^ i));

这将输出:

i = 12.34
i ⊕ i ⊕ i = 12

也许在您的回答中详细解释一下?为什么这样做可以?(但是不要包括“编辑:”,“更新:”或类似的内容——答案应该看起来像是今天写的。) - Peter Mortensen

1
我只在字符串之前加了一个加号(+),这就是解决方案!
+"052254" // 52254

这个问题已经在之前的回答中得到了解决,Nosredna的回答 - Peter Mortensen

0

我使用这个

String.prototype.toInt = function (returnval) {
    var i = parseInt(this);
     return isNaN(i) ? returnval !== undefined ? returnval : - 1  :      i;
}

var str = "7";
var num = str.toInt(); // outputs 7, if not str outputs -1
//or
var num = str.toInt(0); // outputs 7, if not str outputs 0

这样我总是得到一个整数返回。


2
为什么它需要如此复杂? - Peter Mortensen

0
所有之前的答案都是正确的。在执行“typeof x === 'number'”之前,请确保这是一个字符串中的数字。否则,它将返回NaN。
 var num = "fsdfsdf242342";
 typeof num => 'string';

 var num1 = "12423";
 typeof num1 => 'number';
 +num1 = > 12423`

在Node v8.5.0中,var num1 = "12423"; typeof num1; 返回 string - Edu Zamora
1
如果您的目标是避免 NaN,那么直接的解决方案就是测试您获取的值是否为 NaN:var v = whatever-conversion-you-prefer(s); if (isNaN(v)) ...handle the error... else ...use v... - ToolmakerSteve

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接