将字符串转换为整数?

问题描述 投票:1525回答:24

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

javascript string integer data-conversion parseint
24个回答
1998
投票

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

var x = Number("1000")

如果这对你不起作用,那么有parseInt,unary plus,parseFloat with 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])

如果您的字符串已经是整数形式,则为unary plus:

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)

15
投票

另外作为旁注:Mootools具有函数toInt(),用于任何本地字符串(或浮点(或整数))。

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

15
投票

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


14
投票

请看下面的例子。这将有助于消除您的疑虑

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。

我们可以使用这个一元“+”运算符来解析浮点数...


10
投票

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


9
投票

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

任何Math操作也会将它们转换为数字,例如......

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
投票

在我看来,没有答案涵盖所有边缘情况,因为解析浮点应该导致错误。

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

7
投票

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

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

1
投票

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

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

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

1
投票

另一种选择是将值与自身加倍异或:

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

这将输出:

i = 12.34
i ⊕ i ⊕ i = 12

210
投票

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

0
投票

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>

0
投票

我用这个

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

这样我总能得到一个int。


0
投票

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

+"052254" //52254

希望能帮助到你 ;)


0
投票

将数字的乘法与它们各自的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;

}


0
投票

这是最简单的解决方案

let myNumber = "123" | 0;

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

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

119
投票

在javascript中将字符串转换为数字有两种主要方法。一种方法是解析它,另一种方法是将其类型更改为数字。其他答案中的所有技巧(例如一元加)都涉及隐含地将字符串的类型强制转换为数字。您也可以使用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这样的字符串。由于您需要原始数字而不是数字包装器对象,因此请确保不要将new放在Number函数前面。

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

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”,而解析方法则不理解。

习惯

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

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


50
投票

ParseInt()和+是不同的

parseInt("10.3456") // returns 10

+"10.3456" // returns 10.3456

36
投票

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

我用这种方式将字符串转换为 INT 数

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

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

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

你可以创建简单的功能,例如,

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


32
投票

试试parseInt。

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

30
投票

Fastest

var x = "1000"*1;

测试

这里有一点速度比较(仅限Mac Os)...... :)

对于chrome'plus'和'mul'来说最快(> 700,000,00 op / sec),'Math.floor'是最慢的。对于Firefox'plus'是最慢的(!)'mul'是最快的(> 900,000,000 op / sec)。在Safari中,'parseInt'很精巧,'number'是最慢的(但是resulats非常相似,> 13,000,000 <31,000,000)。因此,用于将字符串转换为int的Safari比其他浏览器慢10倍。所以获胜者是'mul':)

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

enter image description here

更新

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


26
投票

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

这是一个老问题,但我喜欢这个诀窍:

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

双位按位负数会在小数点后丢弃任何内容并将其转换为数字格式。我被告知它比调用函数和诸如此类的东西要快一些,但我并不完全相信。

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

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

18
投票

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

parseInt("5.6e-14") 

会导致

5 

代替

0
© www.soinside.com 2019 - 2024. All rights reserved.