我正在尝试将一串科学记数法转换为实际数字。
我的测试字符串的格式如下:
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);
元素错误地返回以下内容:
1.000000000000000 %from the first number before "E"
00 %after the "E" in the first number
2.000000000000000 %from the second number before "E"
任何人都知道如何解决这个问题?
答案 0 :(得分: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))
答案 1 :(得分:1)
请改为尝试:
for s in (myString..","):gmatch("(%S+),") do print(s) end
答案 2 :(得分: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
答案 3 :(得分: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))
答案 4 :(得分:0)
这是另一个答案,它很强大但可能有点过分:
f = loadstring("return {" .. myString .."}")
if f==nil then end -- myString malformed
elements = f()