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


当前回答

尝试parseInt函数:

var number = parseInt("10");

但有一个问题。如果您尝试使用parseInt函数转换“010”,它将检测为八进制数,并将返回数字8。因此,需要指定基数(从2到36)。在这种情况下,底座10。

parseInt(string, radix)

例子:

var result = parseInt("010", 10) == 10; // Returns true

var result = parseInt("010") == 10; // Returns false

请注意,parseInt在解析任何有效数据后忽略错误数据。此guid将解析为51:

var result = parseInt('51e3daf6-b521-446a-9f5b-a1bb4d8bac36', 10) == 51; // Returns true

其他回答

您可以使用加号。例如:

var personAge = '24';
var personAge1 = (+personAge)

然后您可以看到新变量的typebytypeofpersonAge1;这是数字。

在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(通常是发现解析失败的唯一方法)。

在JavaScript中,您可以执行以下操作:

解析Int

parseInt("10.5") // Returns 10

与1相乘

var s = "10";
s = s*1;  // Returns 10

使用一元运算符(+)

var s = "10";
s = +s;  // Returns 10

使用按位运算符

(注:在2140000000之后开始破裂。示例:~~“2150000000”=-214967296)

var s = "10.5";
s = ~~s; // Returns 10

使用Math.floor()或Math.ceil()

var s = "10";
s = Math.floor(s) || Math.ceil(s); // Returns 10

另一种选择是将值与自身进行双重XOR:

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

这将输出:

i = 12.34
i ⊕ i ⊕ i = 12

我喜欢这个把戏:

~~"2.123"; //2
~~"5"; //5

双位负数在小数点之后会丢弃任何内容,并将其转换为数字格式。我被告知它比调用函数等稍快,但我并不完全相信。

我刚才在这里看到的另一个方法(一个关于JavaScript>>>运算符的问题,它是一个零填充右移),它显示了用这个运算符将数字移位0将数字转换为uint32,如果您也希望它无符号,这是很好的。同样,这将转换为无符号整数,如果使用有符号数字,这可能会导致奇怪的行为。

"-2.123" >>> 0; // 4294967294
"2.123" >>> 0; // 2
"-5" >>> 0; // 4294967291
"5" >>> 0; // 5