当前位置 : 主页 > 网络编程 > lua >

是否有一种有效而优雅的方法可以在Lua中截断这样的数字?

来源:互联网 收集:自由互联 发布时间:2021-06-23
我想做的事 我想做的事情非常简单.我想用Lua来检查Plist文件中的行. 假设如果Plist中的一行是整数 -1.00 / integer,我需要将.00关闭以使其为 integer -1 / integer. 我做了什么 我使用函数来读取整
我想做的事

我想做的事情非常简单.我想用Lua来检查Plist文件中的行.

假设如果Plist中的一行是<整数> -1.00< / integer>,我需要将.00关闭以使其为< integer> -1< / integer>.

我做了什么

我使用函数来读取整个文件内容,并逐行检查和替换.

local function doLineClean( cont )
    newcont = ''
    string.gsub( cont, "(.-)\r?\n", function(line)
        if string.match( line, "<integer>.-<%/integer>" ) then
            string.gsub( line, "<.->(.-)<.->", function(v)
            a, b = string.find(v,"%..*")
            if a and b then
                v = string.sub( v, 0, a - 1 )
            end
            line = "\t\t<integer>"..v.."</integer>"
            end  )
        end
        newcont = newcont .. line .. '\n'
    end  )
    return newcont
end

我的问题

是否有更高效,更优雅的方式来完成同样的工作?

首先,请注意Lua的字符串模式不是完整的正则表达式.它们更有限,功能更弱,但通常足够(如本例所示).

为什么不是一个更简单的替代品,如下所示?

local s1 = [[
<integer>3</integer>
<integer>3.12</integer>
<integer>-1.00</integer>
<integer>-1.99</integer>
<float>3.14</float>
]]

local s2 = s1:gsub('(<integer>%-?%d+)%.%d+','%1')
print(s2)
--> <integer>3</integer>
--> <integer>3</integer>
--> <integer>-1</integer>
--> <integer>-1</integer>
--> <float>3.14</float>

这发现:

>文本<整数>,
>可选后跟一个文字连字符(% – ?)
>后跟一个或多个数字字符(%d)
>后跟一个文字句点(%.)
>后跟一个或多个数字字符(%d)

并将其替换为第一次捕获(上面1-3的内容).

请注意,如果您的浮点数不能包含前导数字(例如<整数> .99< / integer>)或科学记数法(例如< integer> 1.34e7< / integer>),则无法使用此功能.

网友评论