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


Answers:


2151

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

var x = Number("1000")

如果这对您不起作用,则有parseInt一元加号带有floor的parseFloatMath.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并根据需要舍入。在这里我用地板。

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)

1
jsperf.com/performance-of-parseint/29,您好@jedierikb我正在编辑jsperf链接。添加'4'>>0'4'>>>0
emaniacs 2014年

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

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

3
小心。双方parseIntparseFloat愉快地接受信件。仅一致地Number返回NaN
Karl Pokus

2
我认为,NaN对于每个不完全是整数的值,解析一个整数都将导致exception / 。因此,没有这些工作为Number('2.2')要挟来2Number('')裹胁0
米哈尔克纳皮克

225

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

4
2016

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

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

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

121

在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包装器对象,因此请确保不要放在newNumber函数的前面。

显然,转换为数字会为您提供一个可能是浮点数而不是整数的值,因此,如果要使用整数,则需要对其进行修改。有几种方法可以做到这一点:

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

记住,所有的这些方法的理解指数形式,所以2e2200不是NaN的。同样,Number可以理解“ Infinity”,而parse方法不能。

自订

这两种方法都不可能完全满足您的要求。例如,通常我希望解析失败时抛出错误,并且不需要Infinity,指数或前导空格。根据您的用例,有时编写一个自定义转换函数很有意义。

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


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

6
@kybernetikos应该应该为.replace(/[^0-9.]/g, ""),否则“ 1.05”将变为“ 105”。
J.Steve

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

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

1
@kybernetikos在中var fixed = Number("97.654").toFixed(0); // rounded rather than truncatedstring由于.toFixed方法的缘故,我们得到了(而不是 number整数)。如果我们想要四舍五入的整数,最好使用它更好Math.round("97.654");
Edu Zamora

50

ParseInt()和+不同

parseInt("10.3456") // returns 10

+"10.3456" // returns 10.3456

37

最快的

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%)快一点。我更新上面的图片并测试


36

尽管这是一个古老的问题,但这可能对某人有所帮助。

我用转换字符串的这种方式INT

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

因此,当乘以1时,值不会改变,但是js自动返回一个数字。

但是,如下所示,如果您确定stra是数字(或可以表示为数字),则应使用此方法,否则它将返回NaN-不是数字。

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

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

在此处输入图片说明


33

尝试parseInt。

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

4
您可能还希望在其中包含基数var number = parseInt(“ 10”,10);
Joel Coehoorn

27

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

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

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

双按位负数会在小数点后删除所有内容,并将其转换为数字格式。有人告诉我它比调用函数之类的要快,但我并不完全相信。

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

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

19

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

parseInt("5.6e-14") 

将导致

5 

代替

0

14
使用parseInt浮动效果不正确。parseFloat在这种情况下可以正常工作。
benekastah 2011年

16

要将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。


6
问题是“如何在JavaScript中将字符串转换为整数”
Pierre Arlaud 2015年

15

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

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

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

2
这个问题不是关于mootools的,而是关于JavaScript的。
利亚姆

14

请看下面的例子,它将帮助您消除疑问

Example                  Result

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

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


12

我们可以使用+(stringOfNumber)而不是使用parseInt(stringOfNumber)

例如:+("21")返回int,如parseInt("21")

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


1
但是您不能在公式中使用它!即(1 +(“ 21”))* 10 === 1210!
亚历山大·瓦西里耶夫

2
@AlexanderVasilyev我想可以,您是否只在圆括号周围加上了一个括号+
NiCk Newman

@NiCkNewman我从我们评论的答案的示例中得到+(“ 21”)。
亚历山大·瓦西里耶夫

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

11

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



8

谷歌给了我这个答案,所以...

实际上,我需要将字符串“保存”为整数,以便在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
这是一种存储和检索4字节值的有趣方法。它没有回答问题的常规解释:如何将数字的字符串表示形式转换为整数值。无论如何,int2str如果字节为0(该字节可能是值中的合法元素),函数便会停止,因此应删除if... ,以便break获得完整的4字节值。
Suncat2000

8

我认为,没有答案能涵盖所有极端情况,因为解析浮点数会导致错误。

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

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

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


2

以上所有内容均正确。请先通过执行“ 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;返回string
Edu Zamora '18

2

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

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

这将输出:

i = 12.34
i  i  i = 12

2

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

+"052254" //52254

希望能帮助到你 ;)


2

将数字的相乘和十的幂相加:

即: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;

}


1

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>


1

我用这个

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

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


1

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

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

1
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);
}

1

您可以使用加号,例如=>

var personAge ='24'; var personAge1 =(+ personAge)

然后您可以看到typeof personAge是数字

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.