Anonymous

Module:Shared: Difference between revisions

From Melvor Idle
Replace GCD function with an implementation of the Euclidean algorithm, so that fewer iterations occur when numbers differ greatly in magnitude
(Added custom sort function)
(Replace GCD function with an implementation of the Euclidean algorithm, so that fewer iterations occur when numbers differ greatly in magnitude)
(8 intermediate revisions by one other user not shown)
Line 178: Line 178:
   
   
         if(maxDigits ~= nil and decimals > maxDigits) then
         if(maxDigits ~= nil and decimals > maxDigits) then
             result = tonumber(string.format("%."..maxDigits.."f", result))
             result = string.format("%."..minDigits.."f", tonumber(string.format("%."..maxDigits.."f", result)))
         elseif(minDigits ~= nil and decimals < minDigits) then
         elseif(minDigits ~= nil and decimals < minDigits) then
             result = string.format("%."..minDigits.."f", result)
             result = string.format("%."..minDigits.."f", result)
Line 208: Line 208:
         for key, value in pairs(List) do
         for key, value in pairs(List) do
             if (value == Item) then
             if (value == Item) then
                 return true
                 return true, key
             elseif (IgnoreCase and string.upper(value) == string.upper(Item)) then
             elseif (IgnoreCase and string.upper(value) == string.upper(Item)) then
                 return true
                 return true, key
             end
             end
         end
         end
Line 269: Line 269:
     return res
     return res
end
end
 
-- Euclidean Greatest Common Divisor algorithm
function p.gcd(a, b)
  if b ~= 0 then
    return p.gcd(b, a % b)
  else
    return math.abs(a)
  end
end
 
--Formats a pair of numbers as a reduced fraction
function p.fraction(n, d)
  local gcd = p.gcd(n, d)
  return p.formatnum(n/gcd)..'/'..p.formatnum(d/gcd)
end
 
function p.timeString(timeInSeconds, shorten)
  local remain = timeInSeconds
  local days, hours, minutes = 0, 0, 0
  local isShort = shorten
 
  local pieces = {}
 
  if remain >= 86400 then
    days = math.floor(remain / 86400)
    remain = remain - days * 86400
    if isShort then
      table.insert(pieces, days..'d')
    elseif days > 1 then
      table.insert(pieces, days..' days')
    else
      table.insert(pieces, days..' day')
    end
  end
  if remain >= 3600 then
    hours = math.floor(remain / 3600)
    remain = remain - hours * 3600
    if isShort then
      table.insert(pieces, hours..'h')
    elseif hours > 1 then
      table.insert(pieces, hours..' hours')
    else
      table.insert(pieces, hours..' hour')
    end
  end
  if remain >= 60 then
    minutes = math.floor(remain / 60)
    remain = remain - minutes * 60
    if isShort then
      table.insert(pieces, minutes..'m')
    elseif minutes > 1 then
      table.insert(pieces, minutes..' minutes')
    else
      table.insert(pieces, minutes..' minutes')
    end
  end
  if remain > 0 then
    if isShort then
      table.insert(pieces, remain..'s')
    elseif remain > 1 then
      table.insert(pieces, remain..' seconds')
    else
      table.insert(pieces, remain..' second')
    end
  end
  return table.concat(pieces, ', ')
end
 
function p.fixPagename(pageName)
  local result = pageName
  result = string.gsub(result, "%%27", "'")
  result = string.gsub(result, "&#39;", "'")
  return result
end
 
function p.tablesEqual(t1, t2)
  if p.tableCount(t1) ~= p.tableCount(t2) then return false end
  for i, val in p.skpairs(t1) do
    if type(val) ~= type(t2[i]) then
      return false
    elseif type(val) == 'table' then
      if not p.tablesEqual(val, t2[i]) then return false end
    elseif t2[i] ~= val then
      return false
    end
  end
  return true
end
 
return p
return p