在Lua中使数字更易于阅读

所以,在过去一个小时左右,我一直在处理这个函数,以便更容易阅读数字。

目前,这个函数在字符长度小于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
点赞
用户415823
用户415823

可能有更加优雅的方法,但可以在循环中使用 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
2015-01-11 04:43:28
用户234175
用户234175

以下是另一种解决方案,同样使用了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
2015-01-11 05:40:18