Jump to content

Module:NumberAbbr: Difference between revisions

MisterChuChu (talk | contribs)
Blank input fix
MisterChuChu (talk | contribs)
Fix a bug related to calculating illion 999
 
(7 intermediate revisions by the same user not shown)
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 string.match(f.args[1],"[1234567890e%.%-%+]+")~=nil) and tostring(f.args[1]) or "0" --number to abbreviate
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),9) or 3 --decimal places
local dec=f.args[2]~=nil and math.min(math.max(f.args[2],0),11) or 3 --decimal places
local s=f.args[3]~=nil and math.max(f.args[3],3) or 6 --start at 10^
local s=f.args[3]~=nil and math.max(f.args[3],3) or 6 --start at 10^
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?
local ps=f.args[5]==nil and false or f.args[5] --add plus symbol to positive numbers?
local n2="" --create additional variables
local chk=string.gsub(n,",","") --remove commas
local nn=""
if tonumber(chk)==nil then --cancel abbreviation if number is invalid
local ep=0
return n
local isinf=false
local nb=n --keep unmodified number if needed
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
local n2="" --create additional variables
nn=nn..nc
local nn=""
end
local ep=0
n2=nn --keep full number for later
local isinf=false
local nb=n --keep unmodified number if needed
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
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(ep,1,1)=="i" then --check if exponent is infinite
if string.find(n,"i")~=nil then --check if 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
for nc in string.gmatch(n,"[0-9e%.%-%+]+") do --extract valid numerical characters
nn=nn..nc
end
n2=nn --keep full number for later
if tonumber(nn)>999 then --pad variable to 14 characters
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 #nn>14 then
nn=string.sub(nn,1,14)
if string.find(ep,"i")~=nil then --check if exponent is infinite
else
nn=math.huge
for i=#nn,13 do
isinf=true
nn=nn.."0"
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
local nd=nn
nn=""
for nc in string.gmatch(nd,"[0-9]+") do --remove decimal point
nn=nn..nc
end
if ep>=3 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
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
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
m=m>0 and "-" or chk~="0" and ps and "+" or ""
return ep>=s and (abt and "<abbr title=\""..m..n.."\">" or "")..m..nn..""..(not isinf and p.illion({args={math.floor(ep/3-1)}}) or "")..(abt and "</abbr>" or "") or m..n
end
end
return (math.log10(n2)>=3 and ep>=s) and (abt and "<abbr title=\""..n.."\">" or "")..(m>0 and "-" or "")..nn..""..(not isinf and p.illion({args={math.floor(ep/3-1)}}) or "")..(abt and "</abbr>" or "") or nb
end
end


Line 66: Line 79:
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<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
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)]
Cookies help us deliver our services. By using our services, you agree to our use of cookies.