如何在JavaScript中将字符串转换为整数?
最简单的方法是使用本地的Number
函数:
var x = Number("1000")
如果那个方法不适用于你,那么有 parseInt、一元加号、带有 floor 的 parseFloat 和 Math.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并以任何你喜欢的方式进行四舍五入。这里我使用floor函数。
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
和 parseFloat
两者都能接受字母,只有 Number
能始终返回 NaN
,请注意区分。 - Karl PokusNaN
。因此,这些语句都不起作用:Number('2.2')
会被强制转换成 2
,而 Number('')
则被转换成 0
。 - Michał Knapik尝试使用parseInt函数:
var number = parseInt("10");
但是有一个问题。如果您尝试使用parseInt函数转换"010",它会检测为八进制数字,并返回数字8。因此,您需要指定一个基数(从2到36)。在这种情况下,是十进制。
parseInt(string, radix)
例子:
var result = parseInt("010", 10) == 10; // Returns true
var result = parseInt("010") == 10; // Returns false
请注意,parseInt
在解析任何有效数据后会忽略无效的数据。var result = parseInt('51e3daf6-b521-446a-9f5b-a1bb4d8bac36', 10) == 51; // Returns true
parseInt('0asdf', 10)
的结果为 0
。 - Sam在JavaScript中将字符串转换为数字有两种主要方法。一种方法是解析它,另一种方法是将其类型更改为Number。其他答案中的所有技巧(例如一元加)都涉及隐式地强制将字符串的类型转换为数字。您也可以使用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包装对象,请确保在Number函数前面不要加上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
任何按位运算符(这里我使用了按位或,但您也可以像早期答案中所示的那样进行双重否定或位移)都会将值转换为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或其中一种解析方法的输出是否是您预期的数字类型。您几乎肯定会想要使用isNaN
来确保数字不是NaN(通常只有通过这种方式才能发现解析失败)。
.replace(/ [^0-9] / g,"")
,它将从字符串中删除所有非数字字符,然后再进行转换。当然,这会忽略所有你应该报错而不仅仅是解析的疯狂字符串... - kybernetikos.replace(/[^0-9.]/g, "")
пјҢеҗҰеҲҷ"1.05"дјҡеҸҳжҲҗ"105"гҖӮ - J.Stevevar fixed = Number("97.654").toFixed(0); // rounded rather than truncated
中,我们得到的是一个 string
(因为 .toFixed
方法),而不是一个 number
(整数)。如果我们想要四舍五入的整数,最好直接使用 Math.round("97.654");
。 - Edu Zamoravar x = "1000"*1;
这里是速度比较(仅适用于macOS)... :)
对于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)。因此,在将字符串转换为整数方面,Safari要比其他浏览器慢10倍以上。所以赢家是'mul' :)
您可以通过此链接在浏览器上运行它 https://jsperf.com/js-cast-str-to-number/1
我还测试了var x = ~~"1000";
。在Chrome和Safari上,它比var x = "1000"*1
慢一点(<1%),在Firefox上则比较快(<1%)。
ParseInt()和+是不同的
parseInt("10.3456") // returns 10
+"10.3456" // returns 10.3456
+"..."
本质上是 Number("...")
。 - ToolmakerSteve我使用以下方法将字符串转换为数字:
var str = "25"; // String
var number = str*1; // Number
因此,当乘以1时,数值不会改变,但JavaScript会自动返回一个数字。
但正如下面所示,只有在确定 str
是一个数字(或可以表示为数字)时才应该使用它,否则将返回NaN - 不是一个数字。
您可以创建一个简单的函数来使用,例如:
function toNumber(str) {
return str*1;
}
试试使用 parseInt。
var number = parseInt("10", 10); //number will have value of 10.
我喜欢这个技巧:
~~"2.123"; //2
~~"5"; //5
双重按位取反可以去掉小数点后的部分并将其转换为数字格式。有人告诉我这比调用函数等方法稍微快一些,但我并不完全相信。"-2.123" >>> 0; // 4294967294
"2.123" >>> 0; // 2
"-5" >>> 0; // 4294967291
"5" >>> 0; // 5
parseInt("4294967296")
和~~"4294967296"
得到不同的结果。即parseInt
将返回4294967296
而~~
将返回0
。 - VLAZ请看下面的例子。它将有助于回答您的问题。
Example Result
parseInt("4") 4
parseInt("5aaa") 5
parseInt("4.33333") 4
parseInt("aaa"); NaN (means "Not a Number")
使用"parseInt"函数只会返回整数部分,而不是字符串。
在JavaScript中,您可以执行以下操作:
ParseInt
parseInt("10.5") // Returns 10
乘以1
var s = "10";
s = s*1; // Returns 10
使用一元操作符(+)
var s = "10";
s = +s; // Returns 10
使用位运算符
(注意:在2140000000
后开始失效。例如:~~"2150000000" = -2144967296
)
var s = "10.5";
s = ~~s; // Returns 10
使用Math.floor()或Math.ceil()
var s = "10";
s = Math.floor(s) || Math.ceil(s); // Returns 10
fr-FR
中,123456789.123
为123 456 789,12
)请参见此讨论。 - vsync