Editing Module:NumberAbbr
Appearance
The edit can be undone. Please check the comparison below to verify that this is what you want to do, and then publish the changes below to finish undoing the edit.
Latest revision | Your text | ||
Line 2: | Line 2: | ||
function p.abbr(frame) | function p.abbr(frame) | ||
local f=frame | local f=frame | ||
local n=f.args[1]~=nil and tostring(f.args[1]) or | local n=f.args[1]~=nil and tostring(f.args[1]) or 0 --number to abbreviate | ||
local dec=f.args[2]~=nil and math.min(math.max(f.args[2],0), | local dec=f.args[2]~=nil and math.min(math.max(f.args[2],0),9) or 3 --decimal places | ||
local | local nn="" --create additional variables | ||
if | local ep=0 | ||
local isinf=false | |||
local m=string.sub(n,1,1)=="-" and 1 or 0 --check if negative | |||
n=string.sub(n,m+1,#n) --if so, remove minus at start | |||
if string.sub(n,1,1)=="i" then --check if infinite | |||
nn=math.huge | |||
isinf=true | |||
else | else | ||
for nc in string.gmatch(n,"[1234567890e%.%-%+]+") do --extract valid numerical characters | |||
nn=nn..nc | |||
end | |||
ep=string.find(nn,"e")~=nil and tonumber(string.sub(nn,string.find(nn,"e")+1,#nn)) or #nn>100 and #nn or math.floor(math.log10(nn)) --get exponent | |||
if string.sub(ep,1,1)=="i" then --check if exponent is infinite | |||
nn=math.huge | nn=math.huge | ||
isinf=true | isinf=true | ||
else | else | ||
nn=string.find(nn,"e")~=nil and string.sub(nn,1,string.find(nn,"e")-1) or nn --remove the exponent from number variable | |||
if | if tonumber(nn)>999 then --pad variable to 14 characters | ||
if #nn>14 then | |||
nn=string.sub(nn,1,14) | |||
else | |||
for i=#nn,13 do | |||
nn=nn.."0" | |||
end | end | ||
end | end | ||
end | end | ||
nn=tonumber(nn)>999 and tonumber(nn)/10^(13-ep%3) or nn | |||
nn=math.floor(nn*10^dec)/10^dec --remove unnecessary decimal places | |||
end | end | ||
end | end | ||
return math.log10(n)>=6 and (m>0 and "-" or "")..nn..""..(not isinf and p.illion({args={math.floor(ep/3-1)}}) or "") or f.args[1] | |||
end | end | ||
Line 79: | Line 62: | ||
if n>=math.huge then | if n>=math.huge then | ||
return math.huge | return math.huge | ||
elseif n>999 then | elseif n>=999 then | ||
i=10^(3*math.floor(math.log10(n)/3)) | i=10^(3*math.floor(math.log10(n)/3)) | ||
return (math.floor(n/i)>1 and p.illion({args={math.floor(n/i),false}}) or "")..(math.floor(math.log10(n)/3)<=#e3 and e3[math.floor(math.log10(n)/3)] or "["..math.floor(math.log10(n)/3).."]")..(r< | return (math.floor(n/i)>1 and p.illion({args={math.floor(n/i),false}}) or "")..(math.floor(math.log10(n)/3)<=#e3 and e3[math.floor(math.log10(n)/3)] or "["..math.floor(math.log10(n)/3).."]")..(r<10 and p.illion({args={n%i,nil,true,r+1}}) or "")..(r==10 and "..." or "") --it can only go so far down, this limit is to prevent not enough memory errors | ||
else | else | ||
return n<b0 and "" or (u00 and n<#e00) and e00[1+n] or e0[1+(n%10)]..e1[1+(math.floor(n/10)%10)]..e2[1+(math.floor(n/100)%10)] | return n<b0 and "" or (u00 and n<#e00) and e00[1+n] or e0[1+(n%10)]..e1[1+(math.floor(n/10)%10)]..e2[1+(math.floor(n/100)%10)] |