【问题标题】:Lua - gmatch scientific notation string to numberLua - gmatch科学记数法字符串到数字
【发布时间】: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

标签: string lua scientific-notation


【解决方案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)? 指定可选分组。
      猜你喜欢
      • 1970-01-01
      • 2019-04-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-22
      • 1970-01-01
      相关资源
      最近更新 更多