Lua - 将科学计数法字符串转换为数字

我正在尝试将科学计数法数字字符串转换为实际数字。

我的测试字符串格式如下:

myString = 1.000000000000000E+00,  2.000000000000000E+02,  -1.000000000000000E+05

我的当前代码:

elements = {}

for s in myString:gmatch('%d+%.?%d*') do
    table.insert(elements, s);
end

return unpack(elements);

Elements 返回以下非正确结果:

1.000000000000000     %来自第一个数字在 "E" 之前
00                    %在第一个数字的 "E" 之后
2.000000000000000     %来自第二个数字在 "E" 之前

有人知道如何解决这个问题吗?

点赞
用户107090
用户107090

尝试使用以下代码替换:

for s in (myString..","):gmatch("(%S+),") do print(s) end
2013-05-21 19:54:51
用户2226988
用户2226988

对我而言,“实际数字”意味着数字数据类型。tonumber() 对科学计数法处理得相当好。

local myString = [[ 1.000000000000000E+00,
 2.000000000000000E+02,  -1.000000000000000E+05 ]]
local function convert(csv)
    local list = {}
    for value in (csv .. ","):gmatch("(%S+)%W*,") do table.insert(list,tonumber(value)) end
    return unpack(list)
end
print(convert(myString))
2013-05-21 21:12:55
用户1442917
用户1442917

将模式扩展到识别可选的尾数,并使用 tonumber 从字符串中获取数字:

elements = {}
myString = "1.000000000000000E+00,  2.000000000000000E+02,  -1.000000000000000E+05"
for s in myString:gmatch('[+%-]?%d+%.?%d*[eE+%-]*%d?%d?') do
    table.insert(elements, tonumber(s))
end
print(unpack(elements))
2013-05-21 21:16:38
用户2303714
用户2303714

我建议使用这里定义的gsplit函数:SplitJoin,然后像这样进行循环:

t = {}
for number in gsplit(myString:gsub('%s',''),',') do
    t[#t+1] = tonumber(number)
end

对于一个字符串:

myString = [[1.000000000000000E+00,  2.000000000000000E+02,  -1.000000000000000E+05]]

table.concat(t,',')的结果是:

1,200,-100000
2013-05-22 09:38:04
用户107090
用户107090

下面是另外一个答案,它很健壮但可能过于复杂:

f = loadstring("return {" .. myString .."}")
if f==nil then  end -- myString格式错误
elements = f()
2013-05-22 11:15:32