【问题标题】:Make easier to read numbers in Lua让 Lua 中的数字更容易阅读
【发布时间】:2015-01-11 13:40:18
【问题描述】:

所以在过去的一个小时左右,我一直在使用这个函数来使数字更容易阅读。 在当前状态下,该函数确实适用于长度低于 6 个字符的数字,如下所示。

1000,000
100,000

请原谅我使用变量的业余方式。

function neatnumber(number)
    local nslen = string.len(tostring(number))
    if nslen <= 3 then
        return number
    end
    local ns = tostring(number)
    local nslen = math.floor(string.len(ns) / 3)-1
    for i=1,nslen do
        neat = string.sub(ns,-#ns,#s-(3*i)) .. "," .. string.sub(ns,#ns-(2))
    end
    return neat
end

【问题讨论】:

  • 我强烈建议您在函数中创建所有这些变量(例如 numberstringlennumberstringlocal。全局变量应该谨慎使用,当然不能用于这样的事情。
  • 你说得对,正如我在工作中所说的业余爱好者。

标签: string lua


【解决方案1】:

可能有更优雅的方式,但您可以在循环中使用string.gsub

local function neatnumber(n)
    local s, i = string.format('%0.f', n)
    repeat
        s, i = s:gsub('^(%-?%d+)(%d%d%d)', '%1,%2')
    until i == 0
    return s
end

gsub 模式扫描字符串中的数字(可能为负数)以查找连续的十进制数字,并捕获整个序列直到最后三位数字。第二次捕获获取最后三位数字。替换将两个捕获连接起来,并在它们之间添加一个逗号。

这应该适用于任何大小的整数(正或负):

neatnumber(2^53)   -->  9,007,199,254,740,992
neatnumber(-2^53)  --> -9,007,199,254,740,992

【讨论】:

  • 如果我使用循环而不是 @greatwolf 回答的内容,这没关系吗?
  • @Ferdi 没关系。我认为 greatwolf 只是表明有多种方法可以解决这个问题。
【解决方案2】:

这是一个类似的解决方案,也使用string.gsub,但没有循环:

function neatnumber(n, delim)
    delim = delim or ','
    n = ('%0.f'):format(n)

    local groups = math.ceil(#n / 3) - 1
    n = n:reverse()
    n = n:gsub('(%d%d%d)', '%1' .. delim, groups)
    return n:reverse()
end

【讨论】:

    猜你喜欢
    • 2022-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-03
    • 1970-01-01
    • 2014-05-18
    • 2011-12-04
    • 1970-01-01
    相关资源
    最近更新 更多