将字符串转换为整数?

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

答案

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

var x = Number("1000")

如果这对您不起作用,则有parseInt一元 plus带有 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";

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

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。其他答案中的所有技巧(例如,一元加号)都涉及将字符串的类型隐式强制为数字。您也可以使用 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 函数的前面放置new的数字。

显然,转换为数字会为您提供一个可能是浮点数而不是整数的值,因此,如果要使用整数,则需要对其进行修改。有几种方法可以做到这一点:

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”,而 parse 方法不能。

自订

这两种方法都不可能完全满足您的要求。例如,通常我希望解析失败时抛出错误,并且不需要 Infinity,指数或前导空格。根据您的用例,有时编写一个自定义转换函数很有意义。

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

ParseInt()和 + 不同

parseInt("10.3456") // returns 10

+"10.3456" // returns 10.3456

尽管这是一个古老的问题,但这可能对某人有所帮助。

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

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

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

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

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

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

在此处输入图片说明

尝试 parseInt。

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

最快的

var x = "1000"*1;

测试

这是速度的比较(仅 Mac OS)... :)

对于 chrome,“plus” 和 “mul” 最快(> 700,000,00 op / sec),“Math.floor” 最慢。对于 Firefox,“加号” 最慢(!),“mul” 最快(> 900,000,000 op / sec)。在 Safari 中,“parseInt” 是禁食,“number” 是最慢的(但结果非常相似,> 13,000,000 <31,000,000)。因此,Safari 将字符串转换为 int 的速度比其他浏览器慢 10 倍以上。所以获胜者是' mul ':)

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

在此处输入图片说明

更新资料

我还测试了var x = ~~"1000"; - 在 Chrome 和 Safari 上比var x = "1000"*1 (<1%)慢一点,在 Firefox 上比var x = "1000"*1 (<1%)慢一点。我更新上面的图片并测试

我在这里发布了错误的答案,对不起。固定。

这是一个老问题,但是我喜欢这个技巧:

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

双按位负数会在小数点后删除所有内容,并将其转换为数字格式。有人告诉我它比调用函数之类的要快,但是我并不完全相信。

编辑:我刚刚在这里看到的另一种方法(关于 javascript >>> 运算符的问题,这是一个零填充右移),它表明使用此运算符将数字移位 0 会将数字转换为uint32 ,如果您也希望它没有签名 。同样,这将转换为无符号整数 ,如果您使用带符号数字,则可能导致奇怪的行为。

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

请注意,如果您使用 parseInt 转换科学计数形式的浮点数!例如:

parseInt("5.6e-14")

将导致

5

代替

0

要将 String 转换为 Integer,我建议使用 parseFloat 和NOT parseInt。原因如下:

使用 parseFloat:

parseFloat('2.34cms')  //Output: 2.34
parseFloat('12.5')     //Output: 12.5
parseFloat('012.3')    //Output: 12.3

使用 parseInt:

parseInt('2.34cms')  //Output: 2
parseInt('12.5')     //Output: 12
parseInt('012.3')    //Output: 12

因此,如果您注意到 parseInt 会舍弃小数点后的值,而 parseFloat 则允许您使用浮点数,因此如果要保留小数点后的值,则更适合。仅当您确定要使用整数值时,才使用 parseInt。