协慌网

登录 贡献 社区

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

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

答案

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

var x = Number("1000")

如果这对你不起作用,那么有parseIntunary plusparseFloat with floorMath.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])

如果您的字符串已经是整数形式,则为 unary plus:

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)

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

在 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 改变的,所以如果没有指定基数,那么现代浏览器不会再触发八进制。 parseInt 将基数理解为基数 36,在这种情况下,大写和小写字母都被视为等价。

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

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

var cast = Number("97");

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

显然,转换为 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"))

请记住,所有这些方法都理解指数表示法,因此2e2200而不是 NaN。此外,Number 理解 “Infinity”,而解析方法则不理解。

习惯

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

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