关于Lua:Lua-gmatch科学符号字符串转换为数字

Lua - gmatch scientific notation string to number

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

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

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

我当前的代码:

1
2
3
4
5
6
7
elements = {}

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

return unpack(elements);

元素错误地返回以下内容:

1
2
3
1.000000000000000     %from the first number before"E"
00                    %after the"E" in the first number
2.000000000000000     %from the second number before"E"

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


在我看来,"实际数字"是指数字数据类型。 tonumber()用科学记数法做得很好。

1
2
3
4
5
6
7
8
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))


我建议使用此处定义的gsplit函数:SplitJoin,然后进行如下循环:

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

输入字符串:

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

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

1
1,200,-100000

尝试以下方法:

1
for s in (myString..","):gmatch("(%S+),") do print(s) end


这是另一个答案,该答案很可靠,但可能会过大:

1
2
3
f = loadstring("return {" .. myString .."}")
if f==nil then  end -- myString malformed
elements = f()

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

1
2
3
4
5
6
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))