如何处理浮点数(如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表示法”。
答案 0 :(得分:3)
假设每一行只包含以空格分隔的数字,您可以让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
答案 1 :(得分:3)
Lua可以直接读取数字:
f=assert(io.open("data.txt"))
while true do
local a,b=f:read("*n","*n")
if b==nil then break end
print(a,b)
end
f:close()
答案 2 :(得分:1)