提问者:小点点

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


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


共3个答案

匿名用户

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

var x = Number("1000")

如果这对您不起作用,那么有parseInt,unary plus,parseFloat with Flood和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.flood:

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

如果您是那种在调用parseInt时忘记输入基数的类型,那么您可以使用parseFloat并任意取整它。 这里我用地板。

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

有趣的是,Math.Round(与Math.Flood一样)将执行字符串到数字的转换,因此如果您希望数字四舍五入(或者如果您在字符串中有一个整数),这是一个很棒的方法,可能是我最喜欢的:

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开头,如果没有指定基数,它将被解释为八进制,这让很多人感到惊讶。 如果未指定基数(例如0xff),则通过使字符串以0x开头来触发十六进制的行为。 ECMAScript5实际上改变了标准,因此如果没有指定基数,当前导为0时,现代浏览器不再触发八进制。 parseInt可以理解以36为基数的半径,在这种情况下,大小写字母都被视为等价的。

将字符串类型更改为数字

上面提到的所有其他不使用parseInt的技巧都涉及到隐式地将字符串强制为一个数字。 我更喜欢显式地这样做,

var cast = Number("97");

这与parse方法有不同的行为(尽管它仍然忽略空格)。 它更严格:如果它不理解整个字符串,则返回NaN,因此您不能将它用于诸如97px之类的字符串。 由于您想要的是基元数字而不是数字包装器对象,因此请确保不要将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

任何按位运算符(这里我做了按位or,但你也可以像前面的答案或位移位那样做双重否定)都将把值转换为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"))

请记住,coeercion理解指数表示法和无穷大,因此2e2200而不是NaN,而parse方法不是。

自定义

这两种方法中的任何一种都不太可能完全满足您的需要。 例如,通常我希望在解析失败时抛出一个错误,并且我不需要对无穷大,指数或前导空格的支持。 根据您的使用情况,有时编写一个自定义转换函数是有意义的。

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