Convert a string to an integer in JavaScript?
如何在javascript中将字符串转换为整数?
最简单的方法是使用本机
1 | var x = Number("1000") |
如果这对您不起作用,那么有parseint、unary plus、parsefloat with floor和math.round方法。
帕森特:
1 2 | 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]) |
一元正号如果字符串已经是整数形式:
1 | var x = +"1000"; |
如果您的字符串是或可能是一个浮点,并且您想要一个整数:
1 | var x = Math.floor("1000.01"); //floor automatically converts string to number |
或者,如果要多次使用math.floor:
1 2 | var floor = Math.floor; var x = floor("1000.01"); |
如果您是那种在调用parseint时忘记输入基数的类型,那么您可以使用parsefloat并根据自己的喜好对其进行取整。这里我用地板。
1 2 | var floor = Math.floor; var x = floor(parseFloat("1000.01")); |
有趣的是,math.round(如math.floor)将执行字符串到数字的转换,因此,如果您希望对数字进行四舍五入(或者如果字符串中有整数),这是一种很好的方法,也许是我最喜欢的方法:
1 2 | var round = Math.round; var x = round("1000"); //equivalent to round("1000",0) |
Try ParseInt函数:
1 | var number = parseInt("10"); |
但有一个问题。如果您试图使用parseint函数转换"010",它将检测为八进制数,并返回数字8。因此,您需要指定一个基数(从2到36)。在这种情况下,以10为基数。
1 | parseInt(string, radix) |
例子:
1 2 3 | var result = parseInt("010", 10) == 10; // Returns true var result = parseInt("010") == 10; // Returns false |
注意,在分析任何有效的数据之后,
1 | var result = parseInt('51e3daf6-b521-446a-9f5b-a1bb4d8bac36', 10) == 51; // Returns true |
在javascript中,有两种主要的方法可以将字符串转换为数字。一种方法是解析它,另一种方法是将其类型更改为数字。其他答案(如一元加号)中的所有技巧都涉及隐式地将字符串类型强制为数字。您也可以使用数字函数显式地执行相同的操作。
句法分析
1 | var parsed = parseInt("97", 10); |
parseint和parsefloat是用于将字符串解析为数字的两个函数。如果解析遇到一个它无法识别的字符,它将自动停止,这对于解析"92px"这样的字符串很有用,但是它也有点危险,因为它不会在错误的输入上给您任何错误,相反,除非字符串以数字开头,否则您将返回NaN。忽略字符串开头的空白。这里有一个例子,它做了一些与你想要的不同的事情,并且没有给出任何出错的迹象:
1 | var widgetsSold = parseInt("97,800", 10); // widgetsSold is now 97 |
最好总是将基数指定为第二个参数。在旧的浏览器中,如果字符串以0开头,如果没有指定基数,它将被解释为八进制,这让很多人感到惊讶。如果未指定基数,例如
将字符串类型更改为数字
上面提到的不使用parseint的所有其他技巧都涉及到隐式地将字符串强制为数字。我更愿意明确地这样做,
1 | var cast = Number("97"); |
这与解析方法有不同的行为(尽管它仍然忽略空白)。它更严格:如果它不理解整个字符串,而返回
显然,转换为数字会给您一个可能是浮点数而不是整数的值,所以如果您想要一个整数,您需要修改它。有几种方法可以做到这一点:
1 2 3 | 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位表示,它将换行。
1 2 3 4 5 | ~~"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 |
要正确处理较大的数字,应使用舍入方法
1 2 3 | Math.floor("3000000000.654") === 3000000000 // This is the same as Math.floor(Number("3000000000.654")) |
记住,所有这些方法都理解指数符号,所以
习俗
这些方法中的任何一种都不可能完全满足您的需要。例如,如果解析失败,通常我希望抛出一个错误,并且不需要支持无穷大、指数或前导空格。根据您的用例,有时编写自定义转换函数是有意义的。
始终检查number或parse方法之一的输出是否是您期望的数字类型。您几乎肯定会想使用
parseInt()和+不同
1 2 3 | parseInt("10.3456") // returns 10 +"10.3456" // returns 10.3456 |
虽然是个老问题,但也许这对某人有帮助。
我使用这种方法将字符串转换为int
1 2 | var str ="25"; // string var number = str*1; // number |
因此,当乘以1时,该值不会改变,但JS会自动返回一个数字。
但如下图所示,如果您确定
您可以创建简单的函数来使用,例如
1 2 3 | function toNumber(str) { return str*1; } |
尝试PARSETIN。
1 | var number = parseInt("10", 10); //number will have value of 10. |
最快的
1 | var x ="1000"*1; |
试验
这里没有速度的比较(仅限Mac OS)。:)
对于chrome,plus和mul最快(>700000,00 op/sec),math.floor最慢。对于firefox,"plus"是最慢的(!)mul'是最快的(>900000000 op/sec)。在Safari中,"parseint"是fastes,"number"是最慢的(但resulats非常相似,>13000000<31000000)。因此,将字符串转换为int的safari比其他浏览器慢10倍以上。所以获胜者是"mul":)
您可以通过此链接在浏览器上运行它https://jspef.com/casttonumber
更新
我也在Chrome上测试了
我把错误的答案贴在这里了,对不起。固定的。
这是一个古老的问题,但我喜欢这个技巧:
1 2 | ~~"2.123"; //2 ~~"5"; //5 |
双位负丢弃小数点后的任何内容,并将其转换为数字格式。有人告诉我,它比调用函数和其他东西稍微快一点,但我并不完全相信。
编辑:我刚才看到的另一个方法(关于javascript>>运算符的问题,它是一个零填充右移),它显示使用此运算符将数字0移位可以将数字转换为uint32,如果您还希望它无符号,这很好。同样,这会转换为无符号整数,如果使用有符号数字,则可能导致奇怪的行为。
1 2 3 4 | "-2.123">>> 0; // 4294967294 "2.123">>> 0; // 2 "-5">>> 0; // 4294967291 "5">>> 0; // 5 |
如果使用parseint转换科学记数法中的浮点,请小心!例如:
1 | parseInt("5.6e-14") |
将导致
1 | 5 |
而不是
1 | 0 |
另请注意:moootools有函数toint(),用于任何本机字符串(或float(或integer))。
1 2 3 | "2".toInt() // 2 "2px".toInt() // 2 2.toInt() // 2 |
要将字符串转换为整数,我建议使用parsefloat而不是parseint。这就是为什么:
使用parsefloat:
1 2 3 | parseFloat('2.34cms') //Output: 2.34 parseFloat('12.5') //Output: 12.5 parseFloat('012.3') //Output: 12.3 |
使用PARSETIN:
1 2 3 | parseInt('2.34cms') //Output: 2 parseInt('12.5') //Output: 12 parseInt('012.3') //Output: 12 |
因此,如果您注意到parseint会丢弃小数点后的值,而parsefloat允许您处理浮点数,因此如果您希望保留小数点后的值,则更适合使用。只有在确定需要整数值时才使用parseint。
请看下面的例子,这有助于消除你的疑虑
1 2 3 4 5 6 | Example Result parseInt("4") 4 parseInt("5aaa") 5 parseInt("4.33333") 4 parseInt("aaa"); NaN (means"Not a Number") |
通过使用parseint函数,它只给出存在整数的op,而不给出字符串
我们可以用
例:
我们也可以使用这个一元"+"运算符来分析浮点…
试着用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | > str = '0' > str - 0 0 > str = '123' > str - 0 123 > str = '-12' > str - 0 -12 > str = 'asdf' > str - 0 NaN > str = '12.34' > str - 0 12.34 |
下面是两个链接,用于比较将字符串转换为int的几种方法的性能
https://jspef.com/number-vs-parseint-vs-plus
http://phrogz.net/js/string_to_number.html
在javascript中有很多方法可以将字符串转换为数值…简单方便,选择适合您的工作方式:
1 2 3 4 | var num = Number("999.5"); //999.5 var num = parseInt("999.5", 10); //999 var num = parseFloat("999.5"); //999.5 var num = +"999.5"; //999.5 |
此外,任何数学运算都会将它们转换为数字,例如…
1 2 3 4 5 6 | var num ="999.5" / 1; //999.5 var num ="999.5" * 1; //999.5 var num ="999.5" - 1 + 1; //999.5 var num ="999.5" - 0; //999.5 var num = Math.floor("999.5"); //999 var num = ~~"999.5"; //999 |
我比较喜欢使用
结果谷歌给了我这个答案,所以…
我实际上需要将字符串"保存"为整数,以便在C和JavaScript之间进行绑定,因此我将字符串转换为整数值:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | /* Examples: int2str( str2int("test") ) =="test" // true int2str( str2int("t€st") ) //"t?st", because"€".charCodeAt(0) is 8364, will be AND'ed with 0xff Limitations: max 4 chars, 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; } |
在我看来,没有任何答案涵盖所有边缘情况,因为解析一个浮动会导致错误。
1 2 3 4 5 | function parseInteger(value) { if(value === '') return NaN; const number = Number(value); return Number.isInteger(number) ? number : NaN; } |
1 2 3 4 | parseInteger("4") // 4 parseInteger("5aaa") // NaN parseInteger("4.33333") // NaN parseInteger("aaa"); // NaN |
以上都是正确的。请先确认这是一个字符串中的数字,然后执行"typeot x=='number'",否则它将返回NaN。
1 2 3 4 5 6 | var num ="fsdfsdf242342"; typeof num => 'string'; var num1 ="12423"; typeof num1 => 'number'; +num1 = > 12423` |
另一个选项是将值与自身的异或加倍:
1 2 3 | var i = 12.34; console.log('i = ' + i); console.log('i ⊕ i ⊕ i = ' + (i ^ i ^ i)); |
这将输出:
1 2 | i = 12.34 i ⊕ i ⊕ i = 12 |
我只在字符串前加了一个加号(+),这就是解决方案!
1 | +"052254" //52254 |
希望有帮助;)
1 2 3 4 5 6 7 | function doSth(){ var a = document.getElementById('input').value; document.getElementById('number').innerHTML = toNumber(a) + 1; } function toNumber(str){ return +str; } |
1 2 3 | <input id="input" type="text"> <input onclick="doSth()" type="submit"> <span id="number"></span> |
我用这个
1 2 3 4 | String.prototype.toInt = function (returnval) { var i = parseInt(this); return isNaN(i) ? returnval !== undefined ? returnval : - 1 : i; } |
这样我总能得到一个内特。