3

科学表記法の文字列を実際の数値に変換しようとしています。

私のテスト文字列は次のようにフォーマットされています:

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"

これを修正する方法を知っている人はいますか?

4

5 に答える 5

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))
于 2013-05-21T21:12:55.303 に答える
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
于 2013-05-22T09:38:04.153 に答える
0

これは堅牢ですが、おそらくやり過ぎです。

f = loadstring("return {" .. myString .."}")
if f==nil then  end -- myString malformed
elements = f()
于 2013-05-22T11:15:32.043 に答える
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))
于 2013-05-21T21:16:38.310 に答える