使Lua中的数字更易读

3

在过去的一个小时左右,我一直在使用这个函数使数字更易读时遇到了问题。 在目前的状态下,该函数能够处理长度低于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

我强烈建议您将函数中的所有变量(如numberstringlennumberstring)都声明为“局部变量”。全局变量应该谨慎使用,尤其不应用于此类情况。 - exists-forall
你说得对,我在工作中确实是个业余爱好者。 - Ferdi
2个回答

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

2

可能有更优雅的方法,但是您可以在循环中使用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
1
@Ferdi 这没关系。我认为greatwolf只是想展示有多种方法来解决这个问题。 - Adam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接