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


我如何转换 string 变成一个 integer 在JavaScript?


1376
2017-07-15 20:22


起源


使用 try { Number(str) } catch (e) { } 用于将字符串安全地转换为数字(如果它是数字),如果不是则失败。号码存储16位数和最多句号,无论这16位数在哪里。保留最重要的数字,其余数字为四舍五入。然后你可以转换,舍入等数字(str)到你想要的任何数字格式。 - Andrew


答案:


最简单的方法是使用原生 Number 功能:

var x = Number("1000")

如果这对你不起作用,那就有了 parseInt函数一元加parseFloat与地板,和 Math.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";

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

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

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

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

如果您是在调用parseInt时忘记放入基数的类型,则可以使用parseFloat并根据需要对其进行舍入。我在这里用地板。

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

有趣的是,Math.round(像Math.floor)将进行字符串到数字的转换,所以如果你想要数字舍入(或者如果字符串中有一个整数),这是一个很好的方式,也许是我的最爱:

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

1751
2017-07-15 20:28



是什么 valueOf 对于?对于字符串,它返回字符串本身。 - pimvdb
“1000”* 1怎么样? - idophir
您还可以使用: Number("1000") 用于此类型转换 - eliocs
你忘了提 ~~。 ~~"1" === 1, ~~1.6 === 1  ~~-1.6 === -1, ~~undefined === 0 (NaN和Infinity以及其他任何无法转换为整数的东西也是如此) - Tomalak
为什么不简单地使用 Number("1000")?? - TMS


尝试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

193
2017-07-15 20:23



2016年不再需要Radix。
它可能不适用于较新的浏览器,但仍然需要基数来实现向后兼容。 - Bonner 웃
怎么样'','或'02'或“02 + 1”,或“03,12”或“03.12”? - stackdave
请注意,这会忽略数字后的错误数据。例如, parseInt('0asdf', 10) 产生 0。 - Sam


在javascript中将字符串转换为数字有两种主要方法。一种方法是解析它,另一种方法是将其类型更改为数字。其他答案中的所有技巧(例如一元加)都涉及隐含地将字符串的类型强制转换为数字。您也可以使用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进行了更改,因此如果没有指定基数,则当前导0时,现代浏览器不再触发八进制。 parseInt将基数理解为基数36,在这种情况下,大写和小写字母都被视为等价。

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

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

var cast = Number("97");

这与解析方法有不同的行为(尽管它仍然忽略空格)。它更严格:如果它不理解整个字符串而不是它返回 NaN,所以你不能用它来像字符串 97px。由于您需要原始数字而不是数字包装器对象,请确保不要放置 new 在Number函数前面。

显然,转换为Number会给出一个可能是float而不是整数的值,所以如果你想要一个整数,你需要修改它。有几种方法可以做到这一点:

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理解“Infinity”,而解析方法则不理解。

习惯

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

始终检查Number或其中一个解析方法的输出是否是您期望的数字。你几乎肯定想要使用 isNaN 确保该数字不是NaN(通常是您发现解析失败的唯一方法)。


108
2017-12-11 07:47



这取决于您是否希望您的代码也接受 97,8,00 和类似与否。一个简单的诀窍是做一个 .replace(/[^0-9]/g, "") 这将从您的字符串中删除所有非数字,然后进行转换。这当然会忽略你应该错误的所有类型的疯狂字符串,而不仅仅是解析... - kybernetikos
@kybernetikos应该是 .replace(/[^0-9.]/g, "")否则“1.05”将变为“105”。 - J.Steve
非常正确,虽然我不会在重要的代码中使用类似的东西 - 有很多方法它可以让你通过的东西真的不想让它通过。 - kybernetikos
我发现在代码中使用Number更具可读性,所以感谢您指出它作为解决方案。 - carlin.scott
@kybernetikos In var fixed = Number("97.654").toFixed(0); // rounded rather than truncated,我们得到了 string (因为 .toFixed 方法)而不是 number (整数)。如果我们想要舍入整数,那么最好只使用它 Math.round("97.654"); - Edu Zamora


ParseInt()和+是不同的

parseInt("10.3456") // returns 10

+"10.3456" // returns 10.3456

50
2018-03-14 09:54





虽然这是一个老问题,但也许这对某人有帮助。

我用这种方式将字符串转换为 INT 数

var str = "25";       // string
var number = str*1;   // number

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

但如下图所示,如果你确定这个,应该使用它 str 是一个数字(或可以表示为数字),否则它将返回NaN - 而不是数字。

你可以创建简单的功能,例如,

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

enter image description here


35
2018-03-16 18:24





试试parseInt。

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

31
2017-07-15 20:23



你可能想要包括 基数 那也是: var number = parseInt(“10”,10); - Joel Coehoorn


我在这里发错了答案,抱歉。固定。

这是一个老问题,但我喜欢这个诀窍:

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

双位按位负数在小数点后丢弃任何内容并将其转换为数字格式。我被告知它比调用函数和诸如此类的东西要快一些,但我并不完全相信。

编辑:我刚才看到的另一种方法 这里 (关于javascript >>>运算符的问题,这是一个零填充右移),表示使用此运算符将数字转换为0将数字转换为a UINT32 如果你也想要它,这很好 无符号。再次,这转换为 无符号整数,如果您使用带签名的号码,可能会导致奇怪的行为。

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

25
2018-01-16 09:51