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

3

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

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

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     %from the first number before "E"
00                    %after the "E" in the first number
2.000000000000000     %from the second number before "E"

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


for s in myString:gmatch'[%d.eE+-]+' do - Egor Skriptunoff
1
table.insert(myString, s); 是你的实际代码还是只是笔误? - greatwolf
这只是我在复制此问题的部分时出现了一个打字错误:D - MrHappyAsthma
5个回答

2
对我而言,“实际数字”指的是数字数据类型。 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))

这个非常出色。非常感谢。我得记住“tonumber()”以备将来之需! - MrHappyAsthma

1
我建议使用此处定义的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

1
尝试使用这个替代方案:
for s in (myString..","):gmatch("(%S+),") do print(s) end

这假设字符串中没有错误,并且逗号后面有一个空格,逗号前面没有空格。 - W.B.
@W.B.,它确实处理逗号后面的空格,但不处理逗号前面的空格。至于输入的正确性,最简单的方法是对每个提取出来的字符串运行tonumber函数,就像Tom的回答中所示。 - lhf

0

扩展模式以识别可选的尾数,并使用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))

1
你忘记了可能存在的符号:[%+%-]?%d+%.?%d*[eE][%+%-]?%d+[eE+%-]* 允许任意数量的这些符号,但是只能有一个 E 或 e,并且在其后 +- 是可选的。在 E 后面必须有一个数字。 - W.B.
已修复;[eE+%-]*的内容是正确的,但是使用Lua模式([eE][-+]%d%d)?无法指定可选分组。 - Paul Kulchenko

0

这里有另一个答案,它很强大,但可能过于复杂:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接