2012-06-12 20 views
6

我想格式化號碼如下所示「1,234」或「1234432」或「123,456,789」,你的想法。我嘗試這樣做如下;的Lua - 格式整數

function reformatint(i) 
    local length = string.len(i) 
    for v = 1, math.floor(length/3) do 
     for k = 1, 3 do 
      newint = string.sub(mystring, -k*v) 
     end 
     newint = ','..newint 
    end 
    return newint 
end 

正如你可以看到我有一個失敗的嘗試,問題是我不能工作在故障什麼的程序我運行這,拒絕張貼錯誤回到我的身邊。

回答

3

好吧,讓我們藉此從上而下。首先,它的失敗,因爲你已經有了一個參考錯誤:

... 
     for k = 1, 3 do 
      newint = string.sub(mystring, -k*v) -- What is 'mystring'? 
     end 
    ... 

你可能要i在那裏,不mystring

其次,雖然與i更換mystring將修復錯誤,它仍然會無法正常工作。

> =reformatint(100) 
,100 
> =reformatint(1) 
,000 

這顯然是不正確的。這似乎是你想要做的是通過字符串,並建立與添加逗號的新字符串。但有幾個問題...

function reformatint(i) 
    local length = string.len(i) 
    for v = 1, math.floor(length/3) do 
     for k = 1, 3 do -- What is this inner loop for? 
      newint = string.sub(mystring, -k*v) -- This chops off the end of 
               -- your string only 
     end 
     newint = ','..newint -- This will make your result have a ',' at 
          -- the beginning, no matter what 
    end 
    return newint 
end 

隨着一些返工,你可以得到一個工作的功能。

function reformatint(integer) 
    for i = 1, math.floor((string.len(integer)-1)/3) do 
     integer = string.sub(integer, 1, -3*i-i) .. 
        ',' .. 
        string.sub(integer, -3*i-i+1) 
    end 
    return integer 
end 

上面的函數似乎工作正常。然而,這相當複雜......可能希望使其更具可讀性。

作爲一個方面說明,一個quick google search發現已經作出了這樣的功能:

function comma_value(amount) 
    local formatted = amount 
    while true do 
    formatted, k = string.gsub(formatted, "^(-?%d+)(%d%d%d)", '%1,%2') 
    if (k==0) then 
     break 
    end 
    end 
    return formatted 
end 
+0

UFF,我撕開包含從網頁的MyString位,很明顯,我是夠傻忘記掉了這一點。 事實證明,我的谷歌搜索是非常不正確的。 我想感謝你,我將深入探討string.sub()如何操作。我希望迄今爲止我的愚蠢至少會讓我學到一些東西。 – Hultin

+1

@Hultin:不需要看不起自己 - 我們都犯錯誤,而且他們有時候很愚蠢。這就是我們學習的方式。是的,理解'字符串。sub()'是值得的嘗試 - 它實際上與其他語言中的子字符串函數略有不同。另外,歡迎來到StackOverflow! – voithos

1

您可以在不循環做:

function numWithCommas(n) 
    return tostring(math.floor(n)):reverse():gsub("(%d%d%d)","%1,") 
           :gsub(",(%-?)$","%1"):reverse() 
end 

assert(numWithCommas(100000) == "100,000") 
assert(numWithCommas(100) == "100") 
assert(numWithCommas(-100000) == "-100,000") 
assert(numWithCommas(10000000) == "10,000,000") 
assert(numWithCommas(10000000.00) == "10,000,000") 

需要第二GSUB避免 - ,100個正在生成。

+1

不錯的嘗試,但是你錯過了長度爲3,6的數字。你可以使用'gsub(「,(% - ?)$」,「%1」)爲最後的'gsub'調用解決這個問題。這會用不帶逗號的版本替換後面的' - ,'或','。確實是 – jpjacobs

+0

。固定。感謝@jpjacobs。 –

10

這裏是一個函數,負數和小數部分考慮:我記得在LÖVE forums討論這個

function format_int(number) 

    local i, j, minus, int, fraction = tostring(number):find('([-]?)(%d+)([.]?%d*)') 

    -- reverse the int-string and append a comma to all blocks of 3 digits 
    int = int:reverse():gsub("(%d%d%d)", "%1,") 

    -- reverse the int-string back remove an optional comma and put the 
    -- optional minus and fractional part back 
    return minus .. int:reverse():gsub("^,", "") .. fraction 
end 

assert(format_int(1234)    == '1,234') 
assert(format_int(1234567)   == '1,234,567') 
assert(format_int(123456789)   == '123,456,789') 
assert(format_int(123456789.1234) == '123,456,789.1234') 
assert(format_int(-123456789.)  == '-123,456,789') 
assert(format_int(-123456789.1234) == '-123,456,789.1234') 
assert(format_int('-123456789.1234') == '-123,456,789.1234') 

print('All tests passed!') 
1

...讓我找找吧...

Found it

這將正整數工作:

function reformatInt(i) 
    return tostring(i):reverse():gsub("%d%d%d", "%1,"):reverse():gsub("^,", "") 
end 

在上面的鏈接,你可以讀到的實施細則。