在javascript中将字符串转换为整数?

Convert a string to an integer in JavaScript?

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


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

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

注意,在分析任何有效的数据之后,parseInt会忽略坏数据。此GUID将解析为51:

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开头,如果没有指定基数,它将被解释为八进制,这让很多人感到惊讶。如果未指定基数,例如0xff,则字符串以0x开头会触发十六进制的行为。标准实际上随ecmascript5而改变,所以现代浏览器不再在没有指定基数的情况下触发八进制。parseint理解以36为基数的半径,在这种情况下,大写和小写字母都被视为等价的。

将字符串类型更改为数字

上面提到的不使用parseint的所有其他技巧都涉及到隐式地将字符串强制为数字。我更愿意明确地这样做,

1
var cast = Number("97");

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

显然,转换为数字会给您一个可能是浮点数而不是整数的值,所以如果您想要一个整数,您需要修改它。有几种方法可以做到这一点:

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

记住,所有这些方法都理解指数符号,所以2e2200,而不是nan。此外,数字理解"无穷大",而解析方法不理解。

习俗

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

始终检查number或parse方法之一的输出是否是您期望的数字类型。您几乎肯定会想使用isNaN来确保该数字不是NaN(通常是发现解析失败的唯一方法)。


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会自动返回一个数字。

但如下图所示,如果您确定str是一个数字(或可以表示为一个数字),则应使用此选项,否则它将返回NaN,而不是一个数字。

您可以创建简单的函数来使用,例如

1
2
3
function toNumber(str) {
   return str*1;
}

enter image description here


尝试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

enter image description here

更新

我也在Chrome上测试了var x = ~~"1000";,Safari比var x ="1000"*1慢一点(<1%),在Firefox上则快一点(<1%)。


我把错误的答案贴在这里了,对不起。固定的。

这是一个古老的问题,但我喜欢这个技巧:

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,而不给出字符串


我们可以用+(stringOfNumber)代替parseInt(stringOfNumber)

例:+("21")parseInt("21")一样,返回21的int。

我们也可以使用这个一元"+"运算符来分析浮点…


试着用str - 0string转换成number

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

我比较喜欢使用+符号,这是在javascript中将字符串转换为数字的优雅方法。


结果谷歌给了我这个答案,所以…

我实际上需要将字符串"保存"为整数,以便在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;
}

这样我总能得到一个内特。