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

有帮助吗?

解决方案

最简单的方法是使用天然Number功能:

var x = Number("1000")

如果不适合你,然后有 parseInt函数一元加 parseFloat与地板 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和圆形它,只要你喜欢。这里我用地板。

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)

其他提示

尝试parseInt函数功能:

var number = parseInt("10");

但是,有一个问题。如果你尝试转换“010”使用parseInt函数功能,它检测为八进制数,因此,你需要指定一个基数(从2到36)将返回8号。在这种情况下基座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

有将字符串转换为数字以JavaScript两种主要方式。一种方法是分析它和另一种方式是其类型更改为一个号码。在所有其他的答案(例如一元加号)的招数涉及隐含强迫的字符串到数字的类型。你也可以做同样的事情明确地数功能。

<强>解析

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字符串。既然你想有一个原始的号码,而不是一个号码包装对象,确保你不把new在数函数的前面。

显然,转换为数字给你,可能是一个浮动,而不是一个整数,所以如果你想要一个整数,你需要修改它的值。这样做有几个方面:

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的。此外,编号理解“无限”,而parse方法没有。

自定义

这是不可能的,要么这些方法做你想要什么。例如,通常我会,如果解析失败,要抛出一个错误,我不需要为无穷大,指数或前导空格的支持。根据您的用例,有时是有意义的编写自定义转换功能。

始终检查数量的输出或一个的parse方法是您所期望的排序数。您将几乎肯定要使用isNaN,以确保数量不NaN的(通常你会发现,解析失败的唯一途径)。

parseInt函数()和+是不同的

parseInt("10.3456") // returns 10

+"10.3456" // returns 10.3456

虽然一个老问题,但也许这可以帮助别人。

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

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

所以,乘以1时,该值不改变,但JS自动返回一个数字。

但是,因为它是如下所示,这应该是如果你是肯定的str是一个数字(或可以表示为数字)所使用的,否则将返回的NaN - 不是数字

可以创建简单的函数来使用,e.g。

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

“在这里输入的图像描述”

尝试parseInt函数。

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

最快

var x = "1000"*1;

测试

下面是速度的比较小(仅MAC OS)...:)

有关铬 '加' 和 'MUL' 是最快的(> 700,000,00运算/秒), 'Math.floor' 是最慢的。对于Firefox '加号' 是最慢的(!) 'MUL' 是最快的(> 9亿运算/秒)。在Safari“parseInt函数”是fastes,“数字”是最慢的(但resulats十分相似,> 13000000 <31000000)。因此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%)。我更新上面的图片和测试

我在这里发布了错误的答案,抱歉。固定的。

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

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

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

编辑:我刚刚看到的另一个方法 这里 (关于 javascript >>> 运算符的问题,这是一个零填充右移)它表明使用此运算符将数字移动 0 会将数字转换为 uint32 如果你也想要的话那就太好了 未签名. 。同样,这会转换为 无符号整数, ,如果您使用带符号的数字,这可能会导致奇怪的行为。

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

如果您使用parseInt函数为float转换成科学记数法当心! 例如:

parseInt("5.6e-14") 

将导致

5 

代替

0

另外,作为边注:Mootools的具有功能toInt(),它是在任何天然的字符串(或浮动(或整数))中使用

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

要字符串转换成整数,我建议使用parseFloat和不是 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函数。

请参阅下面的example.It将有助于清除疑问

Example                  Result

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

通过使用parseInt函数函数它只会得到整数的运算存在并且没有字符串

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

例:+("21")返回的21 INT像parseInt("21")

我们可以用这个一元“+”操作符太解析浮...

尝试str - 0转换stringnumber

> 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

有在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中数字转换。

在我的意见,无应答涵盖所有边缘的情况下作为解析浮子应导致一个错误。

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

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

我确实需要一个字符串“保存”为一个整数,对于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;
}

所有上述的是正确的。请务必在此之前,这是一个字符串的一些做“typeot X ===‘号’”其他明智的将返回NaN的

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

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

另一种选择是双XOR与自身的值:

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

此将输出:

i = 12.34
i ⊕ i ⊕ i = 12

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>

我使用此

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

这样,我总是得到一个int回来。

<强>我只加一个正(+)字符串之前,那是溶液!

+"052254" //52254

希望它能帮助;)

求和的位的乘法与它们各自的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;

}

<强>以下是最简单的解决

let myNumber = "123" | 0;

在最安全的方式,以确保你得到一个有效的整数:

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
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);
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top