【问题标题】:Javascript parseFloat with different ExponentIndicator具有不同 ExponentIndicator 的 Javascript parseFloat
【发布时间】:2020-08-18 18:47:47
【问题描述】:

我想解析以下字符串:-3.755512109246D2 使用 javascript。 请注意,这种格式使用D 作为指数指示符,而不是通常的eE

parseFloat("-3.755512109246D2")

将忽略最后一部分 (D2) 并返回 -3.755512109246

阅读规范,我发现只有eE 被用作ExponentIndicator,从快速搜索看来,这些核心功能实际上是用C++ 编写的。

我在这里有什么选择?考虑到我正在解析包含不同格式数字的大文件,有时它们会有一个指数,该指数可能是eEdD

如果我唯一的方法是重写parseFloat,那么现在它将DdE 处理相同的方式,什么是有效的实现方式?

我的第一个赌注是这样的:

var str ="-3.755512109246D2";
for(var i = 0; i < str.length; i++)
{
    if(str[i] == 'd' || str[i] == 'D')
    {
        str[i] = 'E';
        break;
    }
}
var result = parseFloat(str);

有没有更好的办法?

【问题讨论】:

  • str[i] 在 JavaScript 中不可赋值,因为 str 是一个原语。
  • JavaScript 字符串是不可变的,但你可以使用replace

标签: javascript parsefloat


【解决方案1】:

您可以使用带有正则表达式的replacedD 替换为e,然后使用Number 而不是parseFloat,以确保整个字符串被解释为数字而不是只在第一个无效部分切断:

var result = Number(str.replace(/d/i, "e"));

/d/i 匹配第一个“d” ASCII 不区分大小写。

【讨论】:

  • 请注意,这并不关心字符串是指数还是十六进制,例如Number('0xd')Number('0xe').
  • 这行得通,谢谢。但是,由于我不熟悉 Javascript 中 Regex 的性能,我还有一个问题:通过 char 替换 ExponentIndicator 来复制字符串 char 会不会快得多?
  • @Sturm:不一定,但您可以进行基准测试和分析以找出答案。
猜你喜欢
  • 2012-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多