2013-05-21 111 views
3

我想將一串科學記數法數字轉換爲實際數字。Lua - gmatch科學記數法字符串編號

我的測試字符串格式如下所示:

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

'爲S:gmatch'[%d.eE + - ] +'do' –

+1

是'table.insert(myString,s);'只是一個錯字或是你的實際代碼? – greatwolf

+0

只是一個錯字,當我複製這個問題的部分:D – MrHappyAsthma

回答

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)) 
+0

奇妙地工作。非常感謝。我必須記住未來的「tonumber()」! – MrHappyAsthma

1

試試這個:

for s in (myString..","):gmatch("(%S+),") do print(s) end 
+0

這假定沒有錯誤的字符串,並且在逗號之後有一個空格,並且之前沒有空格。 –

+0

@ 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之後的數字是強制性的。 –

+0

固定;正確的[eE +% - ] *,但是沒有辦法使用Lua模式指定可選分組''([eE] [ - +]%d%d)?'。 –

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 
0

這裏是另一個答案,這是強大的,但可能是矯枉過正:MyString中

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