【问题标题】:Is there an efficient and elegant way to truncate number like this in Lua?在 Lua 中是否有一种高效而优雅的方式来截断这样的数字?
【发布时间】:2014-01-02 03:26:30
【问题描述】:

我想做什么

我想做的很简单。我想使用 Lua 来检查 Plist 文件中的行。

假设如果 Plist 中的一行是 <integer>-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

我的问题

有没有更高效、更优雅的方式来完成同样的工作?

【问题讨论】:

  • 要清楚,您不仅希望-1.00 成为-1,还希望截断&lt;integer&gt; 元素内的所有浮点数?如果是-1.99呢?
  • @Phrogz 是的,截断所有浮点数,-1.99 应该是 -1

标签: lua lua-patterns


【解决方案1】:

首先,请注意 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>

这发现:

  1. 文字&lt;integer&gt;,
  2. (可选)后跟文字连字符 (%-?)
  3. 后跟一个或多个数字字符 (%d+)
  4. 后跟一个文字句点 (%.)
  5. 后跟一个或多个数字字符 (%d+)

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

请注意,如果浮点数没有前导数字(例如&lt;integer&gt;.99&lt;/integer&gt;)或科学记数法(例如&lt;integer&gt;1.34e7&lt;/integer&gt;),这将不起作用。

【讨论】:

  • 感谢一步一步的解释。
【解决方案2】:

这应该可以完成工作:

s = "<integer>-1.00</integer>"
s:gsub("[.]%d*","")

【讨论】:

  • -1 推测该文件可能在其他不应触及的位置具有十进制值,例如&lt;float&gt;3.14&lt;/float&gt;&lt;version&gt;1.2.3&lt;/version&gt;。此外,您在此处的内容还将删除原始句点(例如,"Hello. Bye!" 将变为 "Hello Bye!")。
  • 那么解决方案是基于给定的输入。我不知道文件中还有什么其他内容。解决方案需要修改以防万一...
猜你喜欢
  • 2022-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-09
  • 1970-01-01
  • 2021-11-16
  • 1970-01-01
相关资源
最近更新 更多