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

评论

该页面的底部有一个很棒的表格,用于比较进行转换的各种方法:medium.com/@nikjohn / ...

在没有OP澄清的情况下,可以从将任何字符串转换为数字的意义上解释此问题,即将“ dog”转换为数字(当然可以做到)。

诱饵:@DanielCarrera ..但这里没有人以这种方式解释这个问题。可能是因为如果这是目标,它的措词很可能大不相同。毕竟,这样做的过程(“散列”)从来都不是AFAIK,也从未被称为“转换为整数”。

对于非标准语言环境(例如fr-FR中的123456789.123是123456789,12),请参见以下讨论

#1 楼

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

var x = Number("1000")


如果这对您不起作用,则存在parseInt,一元加,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并根据需要舍入。在这里,我使用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)


评论


jsperf.com/performance-of-parseint/29,@jedierikb,我是jsperf链接的编辑者。添加'4'>> 0和'4'>>> 0。

–异教徒
2014年1月17日在10:41



更新到2015年:从ECMAScript 5开始,带有前导零“ 0”的字符串也将获得默认的基数10,而不是8。明确指定基数10仅对于较旧的浏览器才需要。 kangax.github.io/compat-table/es5 / ...

– Grilse
15年7月30日在10:31

请注意,即使大多数人不认为空字符串代表有效数字,Number('')也会成功(返回0)。并且parseInt('3q')成功(返回3),即使大多数人不认为'3q'是有效数字。

–戴夫·帕切科(Dave Pacheco)
2015年9月3日22:15在

小心。 parseInt和parseFloat都愉快地接受字母。只有Number始终返回NaN。

–卡尔·普库斯(Karl Pokus)
17年3月14日在9:39

我认为,对于每个不完全是整数的值,解析一个整数都将导致exception / NaN。因此,这些都不能用作Number('2.2')强制为2和Number('')强制为0。

–MichałKnapik
17 Mar 27 '17在15:23

#2 楼

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


评论


2016年不再需要基数。

–user663031
16-10-1在21:23

对于较新的浏览器可能不是,但向后兼容仍需要基数。

–编程教授
17年1月20日在14:21

”,“ 02”或“ 02 + 1”或“ 03,12”或“ 03.12”呢?

– stackdave
17-10-20在6:47

请注意,这将忽略数字后面的错误数据。例如,parseInt('0asdf',10)产生0。

–山姆
18年4月19日在1:08

#3 楼

在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更改的,因此,如果未指定基数,则现代浏览器在前导0时不再触发八进制。 parseInt可以理解基数不超过36的基数,在这种情况下,大写和小写字母都被视为等效。
将字符串的类型更改为数字
上面提到的所有其他技巧使用parseInt,涉及将字符串隐式强制为数字。我更喜欢明确地执行此操作,
var cast = Number("97");

这与解析方法有不同的行为(尽管它仍然忽略空格)。更为严格:如果它不能理解整个字符串,则返回的是NaN,因此您不能将其用于类似97px的字符串。由于您要使用原始数字而不是Number包装器对象,因此请确保不要将new放在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"))

请记住,coerrcion理解指数表示法和无穷大,因此2e2200而不是NaN,而解析方法却不是。
自定义
这两种方法都不大可能完全满足您的要求。例如,通常我希望解析失败时抛出错误,并且不需要Infinity,指数或前导空格。根据您的用例,有时编写一个自定义转换函数很有意义。
始终检查Number的输出或其中一种解析方法是否符合您的期望。您几乎肯定会想要使用isNaN来确保数字不是NaN(通常是您发现解析失败的唯一方法)。

评论


这取决于您是否希望代码也接受97,8,00和类似的内容。一个简单的技巧是执行.replace(/ [^ 0-9] / g,“”),这将从字符串中删除所有非数字,然后进行转换。当然,这会忽略所有可能会出错的疯狂字符串,而不仅仅是解析...

– kybernetikos
2015年2月5日在0:09



@kybernetikos可能应该是.replace(/ [^ 0-9。] / g,“”),否则“ 1.05”将变成“ 105”。

–J.Steve
2015年6月8日17:18



完全正确,尽管无论如何我不会在重要的代码中使用类似的东西-有很多方法可以让您通过某些东西,但实际上并不想通过。

– kybernetikos
2015年6月11日在8:07

我发现使用Number在代码中更具可读性,因此感谢您指出它是一种解决方案。

–carlin.scott
16年7月7日在18:16

@kybernetikos固定为var = Number(“ 97.654”)。toFixed(0); //四舍五入而不是被截断,我们得到的是字符串(由于.toFixed方法)而不是数字(整数)。如果我们想要四舍五入的整数,最好使用Math.round(“ 97.654”);

– Edu Zamora
18年2月17日在9:58

#4 楼

ParseInt()和+不同

parseInt("10.3456") // returns 10

+"10.3456" // returns 10.3456


评论


大概+“ ...”本质上是Number(“ ...”)。

–ToolmakerSteve
8月27日0:15

#5 楼

最快

var x = "1000"*1;


测试

这里的速度比较很少(仅Mac OS)... :)

对于chrome,“ plus”和“ mul”最快(> 700,000,00 op / sec),“ Math.floor”最慢。对于Firefox,“加号”最慢(!),“ mul”最快(> 900,000,000 op / sec)。在Safari中,“ parseInt”是禁食,“ number”是最慢的(但结果非常相似,> 13,000,000 <31,000,000)。因此,Safari将字符串转换为int的速度比其他浏览器慢10倍以上。所以赢家是'mul':)

您可以通过此链接在浏览器上运行它
https://jsperf.com/js-cast-str-to-number/1



更新

我也测试了var x = ~~"1000";-在Chrome和Safari上比var x = "1000"*1(<1%)慢一些,在Firefox上快一点(<1%)。我更新了上面的图片并进行了测试

评论


测试A,B,E和F的结果之间没有显着差异-它们基本上是相同的,

– Alf Eaton
6月4日19:07

我在Chrome上的速度快~~“ 1000”,但它们都非常接近

– Elijah Mock
6月23日在16:44

#6 楼

虽然这是一个老问题,但也许对某人有所帮助。

我使用这种将字符串转换为int数的方法

var str = "25";       // string
var number = str*1;   // number


,当乘以1时,值不变,但是js自动返回一个数字。但是,如下所示,如果您确定str是一个数字(或可以表示为数字),否则将返回NaN-而不是数字。

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

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




#7 楼

尝试parseInt。

var number = parseInt("10", 10); //number will have value of 10.


#8 楼

我在这里张贴了错误的答案,对不起。已修复。

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

~~"2.123"; //2
~~"5"; //5


双位负数会在小数点后下降AND将其转换为数字格式。有人告诉我它比调用函数和诸如此类的要快一些,但是我并不完全相信。

编辑:我刚刚在这里看到的另一种方法(关于javascript >>>运算符的问题,是一个零填充的右移),这表明使用此运算符将数字移位0会将数字转换为uint32,如果您也希望它不带符号,则很好。同样,这将转换为无符号整数,如果您使用有符号数字,则可能导致奇怪的行为。

"-2.123" >>> 0; // 4294967294
"2.123" >>> 0; // 2
"-5" >>> 0; // 4294967291
"5" >>> 0; // 5


#9 楼

请注意,如果您使用parseInt转换科学计数形式的浮点数!
例如:

parseInt("5.6e-14") 


将导致

5 


代替

0


评论


使用parseInt不适用于浮点数。在这种情况下,parseFloat可以正常工作。

– Benekastah
2011年10月14日15:57

这是一个有效的问题-即使parseInt(“ 2e2”)是一个整数,如果parseInt理解指数表示法也将为200,但实际上返回2,因为事实并非如此。

– kybernetikos
7月3日10:54

@kybernetikos-恕我直言,期望parseInt理解浮点表示是不合理的。更适合parseFloat或Number,然后根据需要舍入或截断为int。这是一个更明确的意图声明。

–ToolmakerSteve
8月27日0:20

#10 楼

另请注意:Mootools具有toInt()函数,该函数可用于任何本机字符串(或浮点数(或整数))。

"2".toInt()   // 2
"2px".toInt() // 2
2.toInt()     // 2


评论


第三个示例导致SyntaxError,您应该使用双点,例如:2..toInt();第一个点将结束Number文字的表示,第二个点是属性访问器。

–基督徒C.Salvadó
2010-1-25在6:41

这个问题不是关于mootools的,而是关于JavaScript的。

–利亚姆
2014年5月30日13:56

#11 楼

要将String转换为Integer,我建议使用parseFloat和NOT parseInt。原因如下:

使用parseFloat:

parseFloat('2.34cms')  //Output: 2.34
parseFloat('12.5')     //Output: 12.5
parseFloat('012.3')    //Output: 12.3


使用parseInt:

parseInt('2.34cms')  //Output: 2
parseInt('12.5')     //Output: 12
parseInt('012.3')    //Output: 12


因此,如果您注意到parseInt会舍弃小数点后的值,而parseFloat则允许您使用浮点数,因此如果要保留小数点后的值,则更适合。仅当您确定要使用整数值时,才使用parseInt。

评论


问题是“如何在JavaScript中将字符串转换为整数”

–皮埃尔·阿劳德
2015年9月2日14:08在

#12 楼

请参阅下面的示例。它将使用parseint函数帮助您消除疑虑。

Example                  Result

parseInt("4")            4
parseInt("5aaa")         5
parseInt("4.33333")      4
parseInt("aaa");         NaN (means "Not a Number")


通过使用parseint函数,它将仅给出存在整数的op,而不给出字符串

#13 楼

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

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

我们也可以使用此一元“ +”运算符来解析float。 。

评论


但是您不能在公式中使用它!即(1 +(“ 21”))* 10 === 1210!

–亚历山大·瓦西里耶夫(Alexander Vasilyev)
2015年9月22日14:50在

@AlexanderVasilyev我想你可以,你不只是在+周围加上一个括号吗?

– NiCk Newman
2015年10月30日,下午2:27

@NiCkNewman我从我们评论的答案的示例中得到+(“ 21”)。

–亚历山大·瓦西里耶夫(Alexander Vasilyev)
15年10月31日在10:01

我真的不喜欢这种解决方案。它不像parseInt那样显式。常见的实现是const myNumber = + myNumberAsAString,乍看之下它看起来像是标准的+ =或= +运算符。另外,如果使用不当,可能会导致串联错误。该解决方案基于以下事实:如果未提供数字,则将0假定为左侧。

–Storm Muller
19 Mar 29 '19 at 14:58



我同意@StormMuller。如果由于某种原因,编码器希望比parseInt简洁,则多输入一个字符可以使其更加清晰:0 +“ ...”。这样可以更容易避免误解结果,但是仍然需要一些思想上的思考。因此仍然“闻”。简洁的编码说明了您的意思:使用parseInt。

–ToolmakerSteve
8月27日0:25



#14 楼

尝试使用str - 0string转换为number

> 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 ://jsperf.com/number-vs-parseint-vs-plus

http://phrogz.net/js/string_to_number.html

评论


@AlexanderYau,根据此文档,ToNumber将'1'转换为1,则1-0将为1

– zangw
17年5月1日在13:59

#15 楼

JavaScript中有多种方法可以将字符串转换为数字值...简便易行,请选择一种适合您的方式:

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


也可以数学运算将它们转换为数字,例如...

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中将字符串转换为数字的一种优雅方法。

#16 楼

Google给出了这个答案,所以...

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


评论


这是一种存储和检索4字节值的有趣方法。它没有回答问题的常规解释:如何将数字的字符串表示形式转换为整数值。无论如何,如果字节为0(可能是值中的合法元素),则int2str函数将停止,因此应删除if ... break,以便获得完整的4字节值。

– Suncat2000
17 Mar 16 '17 at 12:47

#17 楼

在我看来,没有任何答案能解决所有极端情况,因为解析浮点数会导致错误。

 function parseInteger(value) {
    if(value === '') return NaN;
    const number = Number(value);
    return Number.isInteger(number) ? number : NaN;
}
 


 parseInteger("4")            // 4
parseInteger("5aaa")         // NaN
parseInteger("4.33333")      // NaN
parseInteger("aaa");         // NaN
 


评论


返回No Number有点浮动,您不觉得吗?

–托马斯·阿尤布(Thomas Ayoub)
17 Mar 27 '17在15:20

它是parseInteger,而不是parseNumber。我猜每个解决方案都是一种解决方法,因为JS不支持整数和浮点数作为单独的类型。如果不是数字误导,我们可以返回null而不是NaN。

–MichałKnapik
17 Mar 27 '17 15:25



#18 楼

这是最简单的解决方案

let myNumber = "123" | 0;


更简单的解决方案

let myNumber = +"123";


#19 楼

另一个选择是将值与自身进行XOR运算:

 var i = 12.34;
console.log('i = ' + i);
console.log('i ⊕ i ⊕ i = ' + (i ^ i ^ i));
 


这将输出:

 i = 12.34
i ⊕ i ⊕ i = 12
 


#20 楼

我只在字符串前加了一个加号(+),这才是解决方案!

+"052254" //52254


希望有帮助;)

#21 楼

将数字的乘积与它们各自的10的幂相加:

即:123 = 100 + 20 + 3 = 1 * 100 + 2 + 10 + 3 * 1 = 1 *(10 ^ 2)+ 2 *(10 ^ 1)+ 3 *(10 ^ 0)

function atoi(array) {

// use exp as (length - i), other option would be to reverse the array.
// multiply a[i] * 10^(exp) and sum

let sum = 0;

for (let i = 0; i < array.length; i++) {
    let exp = array.length-(i+1);
    let value = array[i] * Math.pow(10,exp);
    sum+=value;
}

return sum;


}

#22 楼

function parseIntSmarter(str) {
    // ParseInt is bad because it returns 22 for "22thisendsintext"
    // Number() is returns NaN if it ends in non-numbers, but it returns 0 for empty or whitespace strings.
    return isNaN(Number(str)) ? NaN : parseInt(str, 10);
}


评论


但是,请注意Number支持某些特殊格式,parseInt会错误地解释该格式。例如,Number(“ 0x11”)=> 17,则parseInt将返回0。如果目标是拒绝所有非整数,则搜索非数字可能会更好。或者可以做var f = Number(str);返回f.isInteger()吗? f:NaN;取决于您要允许/拒绝的内容。

–ToolmakerSteve
8月27日0:42



#23 楼

以上所有内容均正确。请先通过执行“ typeot x ==='number'”来确保这是字符串中的数字,否则将返回NaN

 var num = "fsdfsdf242342";
 typeof num => 'string';

 var num1 = "12423";
 typeof num1 => 'number';
 +num1 = > 12423`


评论


在节点v8.5.0中,var num1 =“ 12423”; typeof num1;返回字符串。

– Edu Zamora
18-2-17在9:55



如果您的目标是避免NaN,那么直接的解决方案是测试您获得的NaN值:var v =首选转换。 if(isNaN(v))...处理错误...否则...使用v ...

–ToolmakerSteve
8月27日0:47



#24 楼




 function doSth(){
  var a = document.getElementById('input').value;
  document.getElementById('number').innerHTML = toNumber(a) + 1;
}
function toNumber(str){
  return +str;
} 

 <input id="input" type="text">
<input onclick="doSth()" type="submit">
<span id="number"></span> 




#25 楼

我用这个

String.prototype.toInt = function (returnval) { 
    var i = parseInt(this);
    return isNaN(i) ? returnval !== undefined ? returnval : - 1  :      i; 
}


这样我总是能得到一个整数。

#26 楼

确保获得有效整数的最安全方法:

let integer = (parseInt(value, 10) || 0);


示例:

// Example 1 - Invalid value:
let value = null;
let integer = (parseInt(value, 10) || 0);
// => integer = 0


// Example 2 - Valid value:
let value = "1230.42";
let integer = (parseInt(value, 10) || 0);
// => integer = 1230


// Example 3 - Invalid value:
let value = () => { return 412 };
let integer = (parseInt(value, 10) || 0);
// => integer = 0


#27 楼

您可以使用加号。
例如:
var personAge = '24';
var personAge1 = (+personAge)

,然后您可以通过typeof personAge1看到新变量的类型;这是number

#28 楼

这(可能)不是解析整数的最佳解决方案,但如果您需要“提取”一个整数,例如:
 "1a2b3c" === 123
"198some text2hello world!30" === 198230
// ...
 

这将起作用(仅适用于整数):



 var str = '3a9b0c3d2e9f8g'

function extractInteger(str) {
  var result = 0;
  var factor = 1

  for (var i = str.length; i > 0; i--) {
    if (!isNaN(str[i - 1])) {
      result += parseInt(str[i - 1]) * factor
      factor *= 10
    }
  }

  return result
}

console.log(extractInteger(str)) 




当然,这也可以解析整数,但是比其他方法要慢。
也可以使用此方法解析整数,如果字符串不是整数,则返回NaN数字,但我不明白您为什么要这么做,因为它内部依赖parseInt,而parseInt可能更快。



 var str = '3a9b0c3d2e9f8g'

function extractInteger(str) {
  var result = 0;
  var factor = 1

  for (var i = str.length; i > 0; i--) {
    if (isNaN(str[i - 1])) return NaN
    result += parseInt(str[i - 1]) * factor
    factor *= 10
  }

  return result
}

console.log(extractInteger(str))