如何在JavaScript中将字符串转换为整数?
当前回答
JavaScript中的字符串到数字:
一元+(最推荐)
+numStr易于使用,性能优于其他支持整数和小数
console.log(+'123.45') // => 123.45
其他一些选项:
正在分析字符串:
整数的parseInt(numStr)整数和小数的parseFloat(numStr)
console.log(parseInt('123.456')) // => 123
console.log(parseFloat('123')) // => 123
JavaScript函数
整数的数学函数,如round(numStr)、floor(numStr)、ceil(numStr)整数和小数的数字(numStr)
console.log(Math.floor('123')) // => 123
console.log(Math.round('123.456')) // => 123
console.log(Math.ceil('123.454')) // => 124
console.log(Number('123.123')) // => 123.123
单目运算符
所有基本一元运算符,+numStr、numStr-0、1*numStr,numStr*1和numStr/1所有都支持整数和小数注意numStr+0。它返回一个字符串。
console.log(+'123') // => 123
console.log('002'-0) // => 2
console.log(1*'5') // => 5
console.log('7.7'*1) // => 7.7
console.log(3.3/1) // =>3.3
console.log('123.123'+0, typeof ('123.123' + 0)) // => 123.1230 string
位运算符
两个波浪号~~numStr或左移0,numStr<<0只支持整数,不支持小数
console.log(~~'123') // => 123
console.log('0123'<<0) // => 123
console.log(~~'123.123') // => 123
console.log('123.123'<<0) // => 123
//正在分析console.log(parseInt('123.456'))//=>123console.log(parseFloat('123'))//=>123//功能console.log(数学楼层('123'))//=>123console.log(数学舍入('123.456'))//=>123console.log(数学.ceil('123.454'))//=>124console.log(编号('123.123'))//=>123.123//Unary公司console.log(+'123')//=>123console.log('002'-0)//=>2console.log(1*'5')//=>5console.log('7.7'*1)//=>7.7console.log(3.3/1)//=>3.3console.log('123.123'+0,typeof('123.123'+0))//=>123.1230字符串//按位(Bitwise)console.log(~~'123')//=>123console.log('0123'<<0)//=>123console.log(~~'123.123')//=>123console.log('123.123'<<0)//=>123
其他回答
还有一个附带说明:MooTools有一个函数toInt(),用于任何本机字符串(或浮点(或整数))。
"2".toInt() // 2
"2px".toInt() // 2
2.toInt() // 2
这(可能)不是解析整数的最佳解决方案,但如果您需要“提取”一个整数,例如:
"1a2b3c" === 123
"198some text2hello world!30" === 198230
// ...
这将起作用(仅适用于整数):
var str='3a9b0c3d2e9f8g'函数提取器整数(str){var结果=0;无功因数=1对于(var i=str.length;i>0;i-){if(!isNaN(str[i-1])){result+=parseInt(str[i-1])*因子系数*=10}}返回结果}console.log(extractInteger(str))
当然,这也适用于解析整数,但比其他方法慢。
您也可以使用此方法解析整数,如果字符串不是数字,则返回NaN,但我不明白为什么要这样做,因为这在内部依赖于parseInt,parseInt可能更快。
var str='3a9b0c3d2e9f8g'函数提取器整数(str){var结果=0;无功因数=1对于(var i=str.length;i>0;i-){if(isNaN(str[i-1]))返回NaNresult+=parseInt(str[i-1])*因子系数*=10}返回结果}console.log(extractInteger(str))
在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函数前面放置新的。
显然,转换为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(通常是发现解析失败的唯一方法)。
尝试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
对于C和JavaScript之间的绑定,我实际上需要将字符串“保存”为整数,因此我将字符串转换为整数值:
/*
Examples:
int2str( str2int("test") ) == "test" // true
int2str( str2int("t€st") ) // "t¬st", because "€".charCodeAt(0) is 8364, will be AND'ed with 0xff
Limitations:
maximum 4 characters, so it fits into an integer
*/
function str2int(the_str) {
var ret = 0;
var len = the_str.length;
if (len >= 1) ret += (the_str.charCodeAt(0) & 0xff) << 0;
if (len >= 2) ret += (the_str.charCodeAt(1) & 0xff) << 8;
if (len >= 3) ret += (the_str.charCodeAt(2) & 0xff) << 16;
if (len >= 4) ret += (the_str.charCodeAt(3) & 0xff) << 24;
return ret;
}
function int2str(the_int) {
var tmp = [
(the_int & 0x000000ff) >> 0,
(the_int & 0x0000ff00) >> 8,
(the_int & 0x00ff0000) >> 16,
(the_int & 0xff000000) >> 24
];
var ret = "";
for (var i=0; i<4; i++) {
if (tmp[i] == 0)
break;
ret += String.fromCharCode(tmp[i]);
}
return ret;
}
推荐文章
- 我如何检查如果一个变量是JavaScript字符串?
- 如何显示有两个小数点后的浮点数?
- 如何检测如果多个键被按下一次使用JavaScript?
- 如何通过history. pushstate获得历史变化的通知?
- 在每个列表元素上调用int()函数?
- 使用jQuery改变输入字段的类型
- 在JavaScript中,什么相当于Java的Thread.sleep() ?
- 在Lua中拆分字符串?
- 使用jQuery以像素为整数填充或边距值
- 检查是否选择了jQuery选项,如果没有选择默认值
- Next.js React应用中没有定义Window
- 如何重置笑话模拟函数调用计数之前,每次测试
- 如何强制一个功能React组件渲染?
- 在javascript中从平面数组构建树数组
- 将Dropzone.js与其他字段集成到现有的HTML表单中