如何在JavaScript中将字符串转换为整数?
如何在JavaScript中将string
转换为integer
?
最简单的方法是使用本机Number
函数:
var x = Number("1000")
如果这不适合你,那么就有parseInt , unary plus , parseFloat和floor ,以及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)
试试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
有两种主要方法可以将字符串转换为javascript中的数字。 一种方法是解析它,另一种方法是将其类型更改为数字。 其他答案中的所有技巧(例如,一元加)涉及将字符串的类型隐式强制为数字。 你也可以用数字函数明确地做同样的事情。
解析
var parsed = parseInt("97", 10);
parseInt和parseFloat是用于将字符串解析为数字的两个函数。 如果它解析了一个它不认识的字符,解析就会停下来,这对解析像“92px”这样的字符串很有用,但它也有点危险,因为它不会给你任何错误输入错误,而是你除非字符串以数字开头,否则将返回NaN。 字符串开头的空格被忽略。 这里有一个例子,它做了一些与你想要的不同的东西,并没有指出任何错误:
var widgetsSold = parseInt("97,800", 10); // widgetsSold is now 97
总是将基数指定为第二个参数是一种很好的做法。 在较老的浏览器中,如果字符串以0开头,如果未指定基数会让很多人感到意外,它将被解释为八进制。 如果没有指定基数,例如0xff
,则通过让字符串以0x开头来触发十六进制行为。 这个标准实际上是用ecmascript 5改变的,所以如果没有指定基数,那么现代浏览器不会再触发八进制。 parseInt理解基数为36,在这种情况下,大写和小写字母都被视为等同。
将字符串的类型更改为数字
上面提到的所有其他不使用parseInt的技巧,都涉及将字符串隐式强制为数字。 我更愿意明确地做到这一点,
var cast = Number("97");
这与解析方法有不同的行为(虽然它仍然忽略空格)。 这是更严格的:如果它不理解整个字符串比它返回NaN
,所以你不能使用它像97px
字符串。 既然你想要一个原始数字而不是一个数字包装对象,确保你不把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"))
请记住所有这些方法都理解指数符号,所以2e2
是200
而不是NaN。 另外,Number理解“Infinity”,而解析方法则不理解。
习惯
这些方法中的任何一个都不可能完全按照您的要求进行。 例如,通常我会希望在解析失败时抛出错误,并且我不需要对Infinity,指数或领先空白的支持。 根据您的用例,有时编写自定义转换函数是有意义的。
请务必检查Number或其中一种解析方法的输出是您所期望的数字类型。 你几乎肯定会想用isNaN
来确定这个数字不是NaN(通常是你发现解析失败的唯一方法)。
上一篇: How do I convert a string into an integer in JavaScript?