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" |
有人知道我该如何解决这个问题吗?
在我看来,"实际数字"是指数字数据类型。
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)) |
我建议使用此处定义的
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]] |
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() |
扩展模式以识别可选的尾数,并使用
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)) |