繁体   English   中英

如何将包含科学记数法的字符串转换为正确的 Javascript 数字格式

[英]How to convert a String containing Scientific Notation to correct Javascript number format

我有一个字符串, eg: "4.874915326E7" 将其转换为 javascript 数字格式的最佳方法是什么? (整数或浮点数)? 如果我尝试 parseInt(),最后的E将被忽略。

编辑:

这个答案似乎引起了一些混乱。 最初的问题是询问如何将字符串形式的科学记数法转换为数字(以便它可以用于计算)。 然而,找到这个答案的相当多的人似乎认为这是将一个由 javascript 表示为科学记数法的数字转换为更易于展示的格式。 如果这实际上是您的目标(演示),那么您应该将数字转换为字符串。 请注意,这意味着您将无法轻松地在计算中使用它。

原答案:

将其作为字符串传递给 Number 函数。

Number("4.874915326E7") // returns 48749153.26
Number("4E27") // returns 4e+27

将科学记数法中的数字转换为字符串:

这最好由另一个问题回答,但从那个问题来看,我个人喜欢使用.toLocaleString()的解决方案 请注意,该特定解决方案不适用于负数。 为了您的方便,这里有一个例子:

(4e+27).toLocaleString('fullwide', {useGrouping:false}) // returns "4000000000000000000000000000"

尝试这样的事情

演示

Number("4.874915326E7").toPrecision()

您还可以在字符串前使用+符号来获取数字。

+"4.874915326E7" // == 48749153.26

我有一个这样的值3.53048874968162e-09并使用Number.toFixed(20)为我工作:

value = new Number('3.53048874968162e-09')
//[Number: 3.53048874968162e-9]
value.toFixed(20)
//'0.00000000353048874968'

前言

虽然其他答案已经足够且正确,但为了能够正确解析字符串中的数字,了解类型强制(在您的情况下为转换)的工作方式至少在高层次上是有用的。

强制规则

有一些规则定义了在调用parseIntparseFloatNumber构造函数或+一元运算符等实用程序时如何执行转换:

parseInt(<value>, [radix])函数:

  • 忽略前导空格( " 24" -> 24
  • 空字符串返回NaN
  • 第一个非数字字符完成解析( " 42answer" -> 42
  • 在上述规则下,小数位也完成解析

第三条规则正是为什么指数部分( ExponentPartExponentIndicatorSignedInteger组成,如标准中定义的那样)被忽略 - 一旦遇到e字符,解析就会停止并且函数返回到目前为止解析的数字。 事实上,它会更早停止——当第一次遇到小数点时(见最后一条规则)。

parseFloat()parseInt相同,除了:

  • 它解析第一个小数点
  • 忽略前导0 (因此无法解析十六进制)

作为一个经验法则,你应该使用parseInt转换为“整数”,当parseFloat “浮动”(注意,它们实际上是同一类型)。

Number()构造函数和一元+

  • 对于 boolean -> true1false0

  • 对于null -> 0 (因为null是假的)

  • 对于undefined -> NaN

  • 对于数字:直通

  • 对于字符串:

    • 仅数字 [0-9] 字符,以数字或+- -> 数字(整数)开头
    • 相同,但包含浮点数 -> 数字(浮点数)
    • 包含十六进制 -> 数字(整数)
    • 空字符串 -> 0
    • 所有其他情况 -> NaN
  • 对于对象,调用它们的valueOf()方法。 如果 result 是NaN ,则调用toString()方法。 在幕后,对象被转换为原始对象,而原始对象被转换为数字。

  • 对于符号和 BigInts -> TypeError

数字格式注意事项

由于该问题仍然吸引与格式有关的答案和评论(如已接受的答案所有效说明),因此应说明:

应用于编程时, “数字格式”有严格的含义:
数值的表示

“转换”作为类型转换也有严格的含义(参见标准

ECMAScript 实现了双精度 64 位格式,这是它唯一的“格式”。 该问题询问将 String 转换为数字格式,因此答案应提供以下信息:

给定值表示电子符号中的数字,如何将字符串转换为数字

参考

  1. ECMAScript 标准中的ToNumber抽象操作
  2. 关于这个主题和其他许多主题,我读过的最好的读物之一:Matt Frisbie 的“Web 开发人员的专业 Javascript”。
  3. 类型强制解释( 博客文章

使用 MathJs 库对我来说效果最好,尝试了很多这些答案,但在某些情况下没有一个能正常工作。 这工作得很好。 更多信息请访问https://mathjs.org/

解决方案,添加 MathJS 然后像这样调用它:

<script src="https://cdn.jsdelivr.net/npm/mathjs@8.0.1/lib/browser/math.js"  crossorigin="anonymous"></script>
    
    function toPlainString(num) {
        return math.format(num,  {notation: 'fixed'});
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM