Lua - gmatch科学记数法字符串到数字
Posted
技术标签:
【中文标题】Lua - gmatch科学记数法字符串到数字【英文标题】:Lua - gmatch scientific notation string to number 【发布时间】:2013-05-21 18:49:42 【问题描述】:我正在尝试将一串科学记数法数字转换为实际数字。
我的测试字符串格式如下:
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
table.insert(myString, s);
只是一个错字还是您的实际代码?
当我为这个问题复制部分时只是一个错字:D
【参考方案1】:
对我来说,“实际数字”是指数字数据类型。 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()”!【参考方案2】:试试这个:
for s in (myString..","):gmatch("(%S+),") do print(s) end
【讨论】:
假设字符串中没有错误,并且逗号后面有一个空格,前面没有空格。 @W.B.,它确实处理逗号之后的空格,但不处理它之前的空格。至于输入的正确性,最简单的方法是在每个提取的字符串上运行 tonumber,如汤姆的回答。【参考方案3】:我建议使用这里定义的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
【讨论】:
【参考方案4】:这是另一个答案,它很强大但可能有点矫枉过正:
f = loadstring("return " .. myString .."")
if f==nil then end -- myString malformed
elements = f()
【讨论】:
【参考方案5】:扩展模式以识别可选尾数并使用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))
【讨论】:
您忘记了前面可能的签名:[%+%-]?%d+%.?%d*[eE][%+%-]?%d+
。 [eE+%-]*
允许任意数量的所有这些符号,而只能有一个 E 或 e 并且 +-
之后是可选的。 E 之后的数字是强制性的。
已修复;更正 [eE+%-]*,但无法使用 Lua 模式 ([eE][-+]%d%d)?
指定可选分组。以上是关于Lua - gmatch科学记数法字符串到数字的主要内容,如果未能解决你的问题,请参考以下文章
原创大叔经验分享(102)lua cjson数字处理成科学计数法