加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

如何在读取字符串时匹配浮点数

发布时间:2020-12-14 21:45:47 所属栏目:大数据 来源:网络整理
导读:如何处理浮点数(如1.234)或使用“E表示法”(如1.23e04)处理字符串时? 举个例子,假设我想从数据文件中读取数字,如下所示: 0.0 1.295e-030.1 1.276e-030.2 1.261e-030.3 1.247e-030.4 1.232e-030.5 1.218e-03 目前我编写了自己的函数来转换它包含的数字中的
如何处理浮点数(如1.234)或使用“E表示法”(如1.23e04)处理字符串时?

举个例子,假设我想从数据文件中读取数字,如下所示:

0.0 1.295e-03
0.1 1.276e-03
0.2 1.261e-03
0.3 1.247e-03
0.4 1.232e-03
0.5 1.218e-03

目前我编写了自己的函数来转换它包含的数字中的每一行,但它不是很优雅,根本不可移植:具有不同“布局”的数据文件会产生错误.

这是一个简单的示例,它读取已经呈现的数据文件并打印以筛选数字:

function read_line(str)
   local a,b,c,d,e = str:match(
      "^%s*(%d+)%.(%d+)%s+(%d+)%.(%d+)[Ee]%-*(%d+)")
   if str:match("%-") then
      e = -tonumber(e)
   end
   local v1 = a + .1*b
   local v2 = (c + .001*d) * 10^e
   return v1,v2
end

for line in io.lines("data.txt") do
   print(read_line(line))
end

这就是结果:

0   0.001295
0.1 0.001276
0.2 0.001261
0.3 0.001247
0.4 0.001232
0.5 0.001218

这确实是我想要实现的结果,但是有更优雅和一般的方法来处理这个问题吗?

注意:数据文件可以包含两列以上的数字,并且可以同时具有浮点表示和“E表示法”.

解决方法

假设每一行只包含空格分隔的数字,你可以让tonumber做繁重的工作,而不是手动匹配数字:

function split_number(str)
    local t = {}
    for n in str:gmatch("%S+") do
        table.insert(t,tonumber(n))
    end
    return table.unpack(t)
end

for line in io.lines("data.txt") do
    print(split_number(line))
end

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读