2015-01-11 5 views
3

지난 1 시간 동안이 함수를 사용하여 숫자를 읽기 쉽게 만들었습니다. 현재 상태에서 함수는 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 
+0

내가 강력하게 당신이 모든을 추천 할 것입니다 ('numberstringlen'과'numberstring'와 같은) 당신의 함수에있는 변수들을'local'합니다. 전역 변수는 사용하지 않아야하며, 이와 같은 경우에는 사용하지 않아야합니다. – SelectricSimian

+0

직장에서 아마추어라고 말한 것처럼 당신 말이 맞습니다. – Ferdi

답변

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 
+0

@greatwolf가 대답 한 대신 루프를 사용하면 문제가되지 않습니까? – Ferdi

+1

@ Ferdi 그것은 중요하지 않아야합니다. 나는 위대한 늑대가 단지 이것에 접근하는 여러 가지 방법이 있음을 보여주고 있다고 생각합니다. – Adam

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 
관련 문제