Module:NumberAbbr: Difference between revisions
Appearance
MisterChuChu (talk | contribs) Fix for inputs like "1.23456e11" resulting in "1.234B" instead of "123.456B" |
MisterChuChu (talk | contribs) No edit summary |
||
Line 7: | Line 7: | ||
local abt=f.args[4]==nil and false or f.args[4] --use abbr tag? | local abt=f.args[4]==nil and false or f.args[4] --use abbr tag? | ||
if | if tonumber(f.args[1])==nil then --cancel abbreviation if number is invalid | ||
return f.args[1] | return f.args[1] | ||
else | else | ||
Line 19: | Line 19: | ||
n=string.sub(n,m+1,#n) --if so, remove minus at start | n=string.sub(n,m+1,#n) --if so, remove minus at start | ||
if string. | if string.find(n,"i")~=nil then --check if infinite | ||
nn=math.huge | nn=math.huge | ||
isinf=true | isinf=true | ||
Line 30: | Line 30: | ||
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 | 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. | if string.find(ep,"i")~=nil then --check if exponent is infinite | ||
nn=math.huge | nn=math.huge | ||
isinf=true | isinf=true | ||
Line 78: | Line 78: | ||
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<3 and p.illion({args={n%i,nil,true,r+1}}) or "")..(r==3 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)] |