2012-06-12 9 views
6

मैं "1,234" या "1,234,432" या "123,456,789" के रूप में देखने के लिए एक संख्या को प्रारूपित करना चाहता हूं, आपको यह विचार मिलता है। मैंने निम्नानुसार ऐसा करने की कोशिश की;लुआ - प्रारूप पूर्णांक

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 नहीं होना चाहता हूँ।

दूसरा, mystring को i के साथ बदलकर त्रुटियों को ठीक करेगा, यह अभी भी सही तरीके से काम नहीं करेगा।

> =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 

ऊपर दिया गया कार्य सही ढंग से काम करता प्रतीत होता है। हालांकि, यह काफी दृढ़ है ... शायद इसे और अधिक पठनीय बनाना चाहते हैं।

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, मैंने वेबपेज से मिस्टिंग युक्त बिट को फिसल दिया, जाहिर है कि मैं इसे बाहर निकालने के लिए भूल गया था। जैसा कि यह पता चला है, मेरी Google खोज बहुत गलत थी। मैं आपको धन्यवाद देना चाहता हूं, और मैं बहुत गहराई से देखूंगा कि string.sub() कैसे संचालित होता है। मुझे उम्मीद है कि अब तक मेरी मूर्खता मुझे कुछ सीखने देगी। – Hultin

+1

@ हल्टिन: खुद को देखने की आवश्यकता नहीं है - हम सभी गलतियां करते हैं, और वे कभी-कभी मूर्ख होते हैं। इस तरह हम सीखते हैं। और हाँ, 'स्ट्रिंग को समझना।उप() 'एक सार्थक प्रयास है - यह वास्तव में अन्य भाषाओं में सबस्ट्रिंग कार्यों की तुलना में थोड़ा अलग है। इसके अलावा, StackOverflow में आपका स्वागत है! – voithos

1

आप छोरों के बिना कर सकते हैं::

एक तरफ ध्यान दें के रूप में, एक quick google search एक समारोह है कि पहले से ही इस के लिए किया गया है पाता

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' कॉल के लिए 'gsub (", (% -?) $ ","% 1 ") का उपयोग करके इसे प्राप्त कर सकते हैं। यह अल्पविराम के बिना संस्करण के साथ पिछला '-,' या '' 'बदलता है। वास्तव में – jpjacobs

+0

। तय की। धन्यवाद @jpjacobs। –

10

यहाँ एक समारोह है कि खाते में ऋणात्मक संख्याओं, और आंशिक भागों ले जाता है:

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

मैं LÖVE forums में इस बारे में चर्चा कर याद ... मुझे इसके लिए देखो ...

Found it! लिंक पर

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

ऊपर आप कार्यान्वयन के बारे में विवरण पढ़ सकते हैं:

यह धनात्मक पूर्णांक के साथ काम करेंगे।