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

2363

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


5
这个页面底部有一张非常好的表格,比较了不同的转换方法:https://medium.com/@nikjohn/cast-to-number-in-javascript-using-the-unary-operator-f4ca67c792ce - John Gilmer
1
在没有提问者的澄清下,这个问题可以被解释为将任何字符串转换为数字,即将“dog”转换为数字(当然可以做到)。 - Daniel Carrera
1
上钩了:@DanielCarrera...然而,这里没有人以那种方式解释问题。可能是因为如果那是目标,它很可能会用不同的措辞表达。毕竟,这样做的过程(“哈希”)从来没有被称为“转换为整数”,至少在我所知道的范围内是这样的。 - ToolmakerSteve
对于非标准区域设置(例如,在fr-FR中,123456789.123123 456 789,12请参见此讨论 - vsync
要解析不同数字系统(例如波斯/法尔斯或阿拉伯语),请参见此帖子此帖子 - Mahozad
32个回答

18

当你使用 parseInt 将一个科学计数法表示的浮点数转换为整数时,请小心!例如:

parseInt("5.6e-14") 

会导致

5 

替代

0

16
使用 parseInt 无法正确处理浮点数。在这种情况下,应使用 parseFloat 进行处理。 - benekastah
这是一个合理的担忧 - 即使parseInt("2e2")是一个整数,如果parseInt理解指数符号,它将是200,但实际上返回2,因为它不理解。 - kybernetikos
@kybernetikos - 我认为期望parseInt理解浮点表示是不合理的。更适合使用parseFloat或Number,然后根据需要四舍五入或截断为整数。这是一个更清晰的意图陈述。 - ToolmakerSteve

13

将一个字符串转换为整数,我建议使用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允许您使用浮点数,因此如果您想保留小数点后面的值,则更适合使用parseFloat。只有在确定需要整数值时才使用parseInt。


14
如何在JavaScript中将字符串转换为整数? - Pierre Arlaud

13
我们可以使用+(数字字符串)代替parseInt(数字字符串)
例如:+("21")会返回整数21,就像parseInt("21")一样。
我们也可以使用这个一元运算符“+”来解析浮点数...

1
但你不能在公式中使用它!即 (1+("21"))*10 === 1210! - Alexander Vasilyev
2
@AlexanderVasilyev 我认为你可以这样做,你只需要在 + 周围加上一个额外的括号即可。 - NiCk Newman
@NiCkNewman,我从我们评论区的答案示例中得到了+("21")。 - Alexander Vasilyev
2
我真的不喜欢这个解决方案。它不像 parseInt 那样明确。一个常见的实现是 const myNumber = +myNumberAsAString,乍一看像是标准的 +==+ 运算符。而且,如果使用不当,可能会导致连接错误。这个解决方案基于当没有提供数字时,0 被假定为左侧的事实。 - Storm Muller
2
我同意@StormMuller的观点。如果出于某种原因,程序员希望比parseInt更简洁,再加一个字符可以使它更清晰:0 + "..."。这样可以更容易地避免误解结果,但仍需要一些思考。所以还是有些不妥。清晰的编码就是说出你的意思:使用parseInt - ToolmakerSteve

12

另外顺便提一下:MooTools 有一个 toInt() 函数,用于将任何原生字符串(或浮点数(或整数))转换为整数。

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

7
第三个示例会导致“SyntaxError”,您应该使用双点号,例如:2..toInt(); 第一个点将结束 Number 文字的表示形式,而第二个点是属性访问器。 - Christian C. Salvadó
5
这个问题不是关于"MooTools",而是关于JavaScript。 - Liam

12

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


10

1
@AlexanderYau,根据此文档'1'将通过ToNumber转换为1,然后1 - 0将得到1 - zangw
">" 提示符意味着什么?在哪个环境下? - Peter Mortensen
@PeterMortensen,>提示符来自Chrome控制台。 - zangw

10

这是最简单的解决方案

let myNumber = "123" | 0;

更简单的解决方案

let myNumber = +"123";

10
在我看来,没有一个答案可以涵盖所有的边缘情况,因为解析浮点数应该会导致错误。
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

2
返回“不是数字”对于浮点数来说有点过于激进了,你觉得呢? - Thomas Ayoub
2
这里应该使用 parseInteger 而不是 parseNumber。我猜每个解决方案都是一种变通方法,因为 JS 不支持整数和浮点数作为单独的类型。如果“非数字”会产生误导,我们可以返回 null - Michał Knapik

9
最简单的方法是像这样使用+
const strTen = "10"
const numTen = +strTen      // string to number conversion
console.log(typeof strTen)  // string
console.log(typeof numTen)  // number

那很可能已经在先前的回答中涉及到了。 - Peter Mortensen

9

JavaScript中的字符串转数字:

一元运算符+(最常用)

  • +numStr 使用方便,性能比其他方法更好
  • 支持整数和小数
console.log(+'123.45') // => 123.45

其他选项:

解析字符串:

  • parseInt(numStr) 用于整数
  • parseFloat(numStr) 用于整数和小数
console.log(parseInt('123.456')) // => 123
console.log(parseFloat('123'))   // => 123

JavaScript函数

  • 数学函数如round(numStr), floor(numStr), ceil(numStr)用于整数。

  • Number(numStr)适用于整数和小数。

console.log(Math.floor('123'))     // => 123
console.log(Math.round('123.456')) // => 123
console.log(Math.ceil('123.454'))  // => 124
console.log(Number('123.123'))     // => 123.123

一元运算符

  • 所有基本的一元运算符,包括+numStrnumStr-01*numStrnumStr*1numStr/1

  • 所有运算符都支持整数和小数

  • 要注意numStr+0。它返回一个字符串。

console.log(+'123')  // => 123
console.log('002'-0) // => 2
console.log(1*'5')   // => 5
console.log('7.7'*1) // => 7.7
console.log(3.3/1)   // =>3.3
console.log('123.123'+0, typeof ('123.123' + 0)) // => 123.1230 string

位运算符

  • 双波浪线 ~~numStr 或 左移0位, numStr<<0
  • 仅支持整数,不支持小数
console.log(~~'123')      // => 123
console.log('0123'<<0)    // => 123
console.log(~~'123.123')  // => 123
console.log('123.123'<<0) // => 123

// Parsing
console.log(parseInt('123.456')) // => 123
console.log(parseFloat('123'))   // => 123

// Function
console.log(Math.floor('123'))     // => 123
console.log(Math.round('123.456')) // => 123
console.log(Math.ceil('123.454'))  // => 124
console.log(Number('123.123'))     // => 123.123

// Unary
console.log(+'123')  // => 123
console.log('002'-0) // => 2
console.log(1*'5')   // => 5
console.log('7.7'*1) // => 7.7
console.log(3.3/1)   // => 3.3
console.log('123.123'+0, typeof ('123.123'+0)) // => 123.1230 string

// Bitwise
console.log(~~'123')      // => 123
console.log('0123'<<0)    // => 123
console.log(~~'123.123')  // => 123
console.log('123.123'<<0) // => 123


2
这更多或少是之前答案的重复。 - Peter Mortensen
基本上是我所知道的所有可能选项的整合,同时也与先前的答案同步。 - JS-JeevaSaravanan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接