如何在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个回答

2848

最简单的方法是使用本地的Number函数:

var x = Number("1000")

如果那个方法不适用于你,那么有 parseInt一元加号带有 floor 的 parseFloatMath.round 方法可供使用。

parseInt()

var x = parseInt("1000", 10); // You want to use radix 10
    // So you get a decimal number even with a leading 0 and an old browser ([IE8, Firefox 20, Chrome 22 and older][1])

一元加号

如果你的字符串已经是整数形式:

var x = +"1000";

floor()

如果你的字符串是浮点数或可能是浮点数,且你想要得到一个整数:

var x = Math.floor("1000.01"); // floor() automatically converts string to number

或者,如果你要多次使用Math.floor:

var floor = Math.floor;
var x = floor("1000.01");

parseFloat()

如果你是那种在调用parseInt时忘记放进基数的人,你可以使用parseFloat并以任何你喜欢的方式进行四舍五入。这里我使用floor函数。

var floor = Math.floor;
var x = floor(parseFloat("1000.01"));

round()

有趣的是,Math.round(和Math.floor一样)会进行字符串到数字的转换,因此如果您想要将数字四舍五入(或者字符串中包含整数),这是一个很好的方法,也许是我最喜欢的方法:

var round = Math.round;
var x = round("1000"); // Equivalent to round("1000", 0)

9
2015年的更新:根据ECMAScript 5标准,以“0”开头的字符串默认解析为十进制(而不是八进制)。只有在旧版浏览器中需要显式指定十进制,否则不需要。 - Grilse
62
请注意,Number('')可以成功地返回0,尽管大多数人不认为空字符串代表一个有效的数字。而parseInt('3q')也可以成功地返回3,尽管大多数人不认为'3q'是一个有效的数字。我会优化语言并确保翻译后的内容与原文意思相同。 - Dave Pacheco
13
注意了,parseIntparseFloat 两者都能接受字母,只有 Number 能始终返回 NaN,请注意区分。 - Karl Pokus
8
我认为,解析整数时,对于任何不是整数的值,都应该抛出异常或返回 NaN。因此,这些语句都不起作用:Number('2.2') 会被强制转换成 2,而 Number('') 则被转换成 0 - Michał Knapik
3
parseInt("6-4")返回6,而Number("6-4")返回NaN。如果你要测试可能是GUID的字符串,这个差别可能是很重要的。请注意,不同的函数对于处理非数字字符时的行为也存在其他差异。 - Simon Green
显示剩余7条评论

287

尝试使用parseInt函数:

var number = parseInt("10");

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

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

4
2016年起,不再需要使用基数。 - user663031
8
虽然对于较新的浏览器来说可能不再需要,但是基数转换仍然需要用于向后兼容。 - Professor of programming
5
请注意,此处忽略数字后面的无效数据。例如,parseInt('0asdf', 10) 的结果为 0 - Sam
最新情况:parseInt("010") == 10; // 现在返回true - 按ctrl-shift-j并将其粘贴到您的浏览器控制台中查看 :) - OCDev
让 x = '5';让 y = +x;控制台输出(y);输出结果为 5。 - Vibhu kumar

152

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

解析

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

parseInt和parseFloat是用于将字符串解析为数字的两个函数。 如果遇到无法识别的字符,解析将会默默停止,这对于解析像“92px”这样的字符串很有用,但也有一定的危险性,因为它不会在错误输入时提供任何错误提示,除非字符串以数字开头,否则你将得到NaN。 字符串开头的空格将被忽略。以下是一个示例,说明它执行了与您想要的不同的操作,并且没有任何指示发生了什么错误:

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

最好的做法是始终将基数作为第二个参数指定。在旧版浏览器中,如果字符串以0开头且未指定基数,则会将其解释为八进制,这让很多人感到惊讶。如果没有指定基数并且字符串以0x开头,则会触发十六进制的行为,例如0xff。 实际上,标准在ECMAScript 5中改变了这种行为,因此现代浏览器在没有指定基数时不再触发八进制。 parseInt理解基数高达36进制,在这种情况下,大小写字母都被视为相等。

将字符串类型更改为数字类型

所有其他不使用parseInt的技巧都涉及隐式地将字符串转换为数字。我更喜欢明确地执行此操作,

var cast = Number("97");

这种方法与解析方法有不同的行为(尽管仍会忽略空格)。它更加严格:如果它无法理解整个字符串,它就会返回NaN,因此您不能将其用于像97px这样的字符串。由于您想要一个原始数而不是一个Number包装对象,请确保在Number函数前面不要加上new

显然,将其转换为一个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(通常只有通过这种方式才能发现解析失败)。


8
这要看你是否想让你的代码也接受“97、8、00”等类似输入。一个简单的技巧是使用.replace(/ [^0-9] / g,""),它将从字符串中删除所有非数字字符,然后再进行转换。当然,这会忽略所有你应该报错而不仅仅是解析的疯狂字符串... - kybernetikos
7
@kybernetikosеҸҜиғҪеә”иҜҘдҪҝз”Ё.replace(/[^0-9.]/g, "")пјҢеҗҰеҲҷ"1.05"дјҡеҸҳжҲҗ"105"гҖӮ - J.Steve
非常正确,尽管我不会在重要的代码中使用这样的东西 - 有太多的方法可以让你不想让它通过的东西通过。 - kybernetikos
3
我发现在代码中使用Number更易读,所以感谢你指出它作为解决方案。 - carlin.scott
2
@kybernetikos 在 var fixed = Number("97.654").toFixed(0); // rounded rather than truncated 中,我们得到的是一个 string(因为 .toFixed 方法),而不是一个 number(整数)。如果我们想要四舍五入的整数,最好直接使用 Math.round("97.654"); - Edu Zamora
显示剩余2条评论

61

最快的

var x = "1000"*1;

测试

这里是速度比较(仅适用于macOS)... :)

对于Chrome,'plus'和'mul'是最快的(>700,000,00 op/sec),'Math.floor'是最慢的。对于Firefox,'plus'是最慢的(!)'mul'是最快的(>900,000,000 op/sec)。在Safari中,'parseInt'是最快的,'number'是最慢的(但结果相当类似,>13,000,000 <31,000,000)。因此,在将字符串转换为整数方面,Safari要比其他浏览器慢10倍以上。所以赢家是'mul' :)

您可以通过此链接在浏览器上运行它 https://jsperf.com/js-cast-str-to-number/1

输入图像描述

我还测试了var x = ~~"1000";。在Chrome和Safari上,它比var x = "1000"*1慢一点(<1%),在Firefox上则比较快(<1%)。


5
测试A、B、E和F的结果没有显著差异,它们在本质上都是一样的。 - Alf Eaton
我在Chrome上得到了比较快的“1000”,但它们都非常接近。 - Elijah Mock

57

ParseInt()和+是不同的

parseInt("10.3456") // returns 10

+"10.3456" // returns 10.3456

据推测,+"..." 本质上是 Number("...") - ToolmakerSteve

40

我使用以下方法将字符串转换为数字:

var str = "25";       // String
var number = str*1;   // Number

因此,当乘以1时,数值不会改变,但JavaScript会自动返回一个数字。

但正如下面所示,只有在确定 str 是一个数字(或可以表示为数字)时才应该使用它,否则将返回NaN - 不是一个数字。

您可以创建一个简单的函数来使用,例如:

function toNumber(str) {
    return str*1;
}

这里输入图片描述


请查看 *为什么在提问时不上传代码/错误的图片?(例如,"图片应该只用于说明无法以其他方式清晰表达的问题,例如提供用户界面的截图。"*)并做正确的事情(它也涵盖了答案和程序输出)。提前致谢。 - Peter Mortensen

38

试试使用 parseInt。

var number = parseInt("10", 10); //number will have value of 10.

问题的正确答案 - Tom Smykowski

30

我喜欢这个技巧:

~~"2.123"; //2
~~"5"; //5
双重按位取反可以去掉小数点后的部分并将其转换为数字格式。有人告诉我这比调用函数等方法稍微快一些,但我并不完全相信。
还有一种方法是在这里看到的(一个有关JavaScript >>>运算符的问题,它是一个零填充右移操作符),它显示使用该运算符将数字向右移动0位会将该数字转换为uint32,如果您还想要unsigned,这很好。同样,这将转换为一个unsigned integer,如果使用了有符号数字,则可能会导致奇怪的行为。
"-2.123" >>> 0; // 4294967294
"2.123" >>> 0; // 2
"-5" >>> 0; // 4294967291
"5" >>> 0; // 5

这仅适用于32位数字。按位操作将强制截断较大的值,因此parseInt("4294967296")~~"4294967296"得到不同的结果。即parseInt将返回4294967296~~将返回0 - VLAZ

23

请看下面的例子。它将有助于回答您的问题。

Example                  Result

parseInt("4")            4
parseInt("5aaa")         5
parseInt("4.33333")      4
parseInt("aaa");         NaN (means "Not a Number")

使用"parseInt"函数只会返回整数部分,而不是字符串。


这真的应该是被接受的答案。 - tfantina
这真的应该是被接受的答案。 - undefined

20

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

ParseInt

parseInt("10.5") // Returns 10

乘以1

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

使用一元操作符(+)

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

使用位运算符

(注意:在2140000000后开始失效。例如:~~"2150000000" = -2144967296

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

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

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

这更多或少是Nosredna的答案的重复,来自2009年。 - Peter Mortensen
@PeterMortensen 它没有位运算符和乘以1。 - TechySharnav

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