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

IT技术 javascript string integer data-conversion
2020-12-28 16:34:19

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

6个回答

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

var x = Number("1000")

如果这对您不起作用,那么有parseIntunary plusparseFloat with floorMath.round方法。

解析:

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)
在我看来,NaN对于不完全是整数的每个值,解析整数应该导致异常/ 因此,没有这些工作为Number('2.2')要挟来2Number('')裹胁到0。
2021-02-09 16:34:19
更新到 2015 年:从 ECMAScript 5 开始,带有前导零“0”的字符串也获得默认基数 10,而不是 8。显式指定基数 10 仅对于旧浏览器是必要的。kangax.github.io/compat-table/es5/...
2021-02-16 16:34:19
parseInt("6-4") 返回 6,而 Number("6-4") 返回 NaN .... 例如,如果您正在测试可能是 guid 的字符串,这可能会有很大的不同。
2021-02-23 16:34:19
当心。双方parseIntparseFloat愉快地接受了信件。只有始终如一地Number返回NaN
2021-02-28 16:34:19
请注意 Number('') 成功(返回 0),即使大多数人不会认为空字符串代表有效数字。并且 parseInt('3q') 成功(返回 3),即使大多数人不会认为 '3q' 是一个有效数字。
2021-03-06 16:34:19

尝试 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
请注意,这会忽略数字后的坏数据。例如,parseInt('0asdf', 10)产生0.
2021-02-08 16:34:19
它可能不适用于较新的浏览器,但仍需要 radix 以实现向后兼容性。
2021-02-18 16:34:19
2016 年不再需要 Radix。
2021-02-20 16:34:19
'' ,或 '02" 或 "02+1" ,或 "03,12" 或 "03.12" 怎么样?
2021-02-24 16:34:19

在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");

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

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

记住,coeercion理解指数符号和无穷远,所以2e2200不是NaN的,而解析方法没有。

风俗

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

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

这取决于您是否希望您的代码也接受97,8,00和相似。一个简单的技巧是执行 a.replace(/[^0-9]/g, "")将从您的字符串中删除所有非数字,然后再进行转换。这当然会忽略您可能应该出错的各种疯狂字符串,而不仅仅是解析......
2021-02-07 16:34:19
我发现在代码中使用 Number 更具可读性,因此感谢您指出它作为解决方案。
2021-02-08 16:34:19
@kybernetikos 在 中var fixed = Number("97.654").toFixed(0); // rounded rather than truncated,我们得到了一个string(因为.toFixed方法)而不是一个 number(整数)。如果我们想要四舍五入的整数,最好只使用Math.round("97.654");
2021-02-28 16:34:19
@kybernetikos 可能应该是.replace(/[^0-9.]/g, ""),否则“1.05”将变成“105”。
2021-03-04 16:34:19
非常正确,尽管无论如何我都不会将类似的东西用于重要的代码 - 有很多方法可以让您真正不想让某些东西通过。
2021-03-08 16:34:19

ParseInt() 和 + 是不同的

parseInt("10.3456") // returns 10

+"10.3456" // returns 10.3456
大概+"..."是本质上Number("...")
2021-03-08 16:34:19

最快的

var x = "1000"*1;

测试

这是速度的小比较(仅限 Mac Os)... :)

对于 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)。因此,将字符串转换为 int 的 Safari 比其他浏览器慢 10 倍以上。所以赢家是' mul ' :)

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

在此处输入图片说明

更新

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

~~"1000"在 Chrome 上的速度更快,但它们都非常接近
2021-02-17 16:34:19
测试 A、B、E 和 F 的结果之间没有显着差异——它们本质上都是相同的,
2021-03-05 16:34:19