<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://pool.calebcooper.ie/index.php?action=history&amp;feed=atom&amp;title=Module%3ANumber_table_sorting</id>
	<title>Module:Number table sorting - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://pool.calebcooper.ie/index.php?action=history&amp;feed=atom&amp;title=Module%3ANumber_table_sorting"/>
	<link rel="alternate" type="text/html" href="https://pool.calebcooper.ie/index.php?title=Module:Number_table_sorting&amp;action=history"/>
	<updated>2026-04-08T03:42:09Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.8</generator>
	<entry>
		<id>https://pool.calebcooper.ie/index.php?title=Module:Number_table_sorting&amp;diff=13796&amp;oldid=prev</id>
		<title>Caleb Cooper: Created page with &quot;local lang = mw.language.getContentLanguage() local Math = require(&#039;Module:Math&#039;) local SortKey = require(&#039;Module:Sortkey&#039;) -- constants local INF = math.huge local NEGINF = -...&quot;</title>
		<link rel="alternate" type="text/html" href="https://pool.calebcooper.ie/index.php?title=Module:Number_table_sorting&amp;diff=13796&amp;oldid=prev"/>
		<updated>2020-10-22T17:36:50Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;local lang = mw.language.getContentLanguage() local Math = require(&amp;#039;Module:Math&amp;#039;) local SortKey = require(&amp;#039;Module:Sortkey&amp;#039;) -- constants local INF = math.huge local NEGINF = -...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;local lang = mw.language.getContentLanguage()&lt;br /&gt;
local Math = require(&amp;#039;Module:Math&amp;#039;)&lt;br /&gt;
local SortKey = require(&amp;#039;Module:Sortkey&amp;#039;)&lt;br /&gt;
-- constants&lt;br /&gt;
local INF = math.huge&lt;br /&gt;
local NEGINF = -math.huge&lt;br /&gt;
local MINUS = &amp;#039;−&amp;#039;  -- Unicode U+2212 MINUS SIGN (UTF-8: e2 88 92)&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- Nts class&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
local Nts = {}&lt;br /&gt;
Nts.__index = Nts&lt;br /&gt;
&lt;br /&gt;
Nts.formats = {&lt;br /&gt;
	no = true,&lt;br /&gt;
	yes = true,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function Nts.new(args)&lt;br /&gt;
	local self = setmetatable({}, Nts)&lt;br /&gt;
&lt;br /&gt;
	self:parseNumber(args[1])&lt;br /&gt;
&lt;br /&gt;
	-- Set the format string&lt;br /&gt;
	self.format = args.format or &amp;#039;yes&amp;#039;&lt;br /&gt;
	if not Nts.formats[self.format] then&lt;br /&gt;
		error(string.format(&lt;br /&gt;
			&amp;quot;&amp;#039;%s&amp;#039; is not a valid format&amp;quot;,&lt;br /&gt;
			tostring(self.format)&lt;br /&gt;
		), 0)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- To display some text before the display version of the number&lt;br /&gt;
	-- {{nts|123456789.00123|prefix=approx.&amp;amp;nbsp;}} → approx. 123,456,789.00123&lt;br /&gt;
	self.prefix = args.prefix or &amp;#039;&amp;#039;&lt;br /&gt;
	&lt;br /&gt;
	-- debug info&lt;br /&gt;
	self.debug = args.debug or &amp;#039;no&amp;#039;&lt;br /&gt;
	self.quiet = args.quiet or &amp;#039;no&amp;#039;&lt;br /&gt;
&lt;br /&gt;
	return self&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Parse the entered number&lt;br /&gt;
function Nts:parseNumber(s)&lt;br /&gt;
	-- sanitize&lt;br /&gt;
	s = s or &amp;#039;&amp;#039;;&lt;br /&gt;
	s = string.gsub(s,&amp;#039;&amp;amp;minus;&amp;#039;,&amp;#039;-&amp;#039;)&lt;br /&gt;
	s = string.gsub(s, MINUS, &amp;#039;-&amp;#039;)&lt;br /&gt;
	self.rawNumberString = s&lt;br /&gt;
	&lt;br /&gt;
	-- fractions. was somewhat but completely broken at some point&lt;br /&gt;
	self.isFraction = (string.find(s, &amp;#039;/&amp;#039;) ~= nil)&lt;br /&gt;
	if self.isFraction then&lt;br /&gt;
		error(string.format(&lt;br /&gt;
				&amp;quot;Fractions are not supported&amp;quot;,&lt;br /&gt;
				tostring(s)&lt;br /&gt;
			), 0)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- format detection&lt;br /&gt;
	self.isScientificNotation = (string.find(s, &amp;#039;e&amp;#039;) ~= nil)&lt;br /&gt;
	&lt;br /&gt;
	-- parse with language options&lt;br /&gt;
	self.number = lang:parseFormattedNumber(s)&lt;br /&gt;
	&lt;br /&gt;
	-- parse with fallback&lt;br /&gt;
	if not self.number then&lt;br /&gt;
		self.number = tonumber(s)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- allow for empty string as a value&lt;br /&gt;
	if not self.number then&lt;br /&gt;
		-- error(string.format(&lt;br /&gt;
		-- 		&amp;quot;&amp;#039;%s&amp;#039; is not a valid number&amp;quot;,&lt;br /&gt;
		-- 		tostring(s)&lt;br /&gt;
		-- 	), 0)&lt;br /&gt;
		self.number = NEGINF&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if self.number &amp;lt; 0 then&lt;br /&gt;
		self.sign = MINUS&lt;br /&gt;
	else&lt;br /&gt;
		self.sign = &amp;#039;&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	self.absNumber = math.abs(self.number)&lt;br /&gt;
	if self.absNumber ~= INF then&lt;br /&gt;
		self.magnitude = math.floor(math.log10(self.absNumber))&lt;br /&gt;
		self.significand = self.number / 10^self.magnitude&lt;br /&gt;
		self.precision = Math._precision(self.rawNumberString)&lt;br /&gt;
		self.integer = math.floor(self.absNumber)&lt;br /&gt;
		self.fractional = math.abs(self.number - self.integer)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Nts:makeDisplay()&lt;br /&gt;
	local ret ={}&lt;br /&gt;
&lt;br /&gt;
	if self.quiet == &amp;#039;yes&amp;#039; then&lt;br /&gt;
		return &amp;#039;&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	ret[#ret + 1] = self.prefix&lt;br /&gt;
	local sciNotation = string.find(tostring(self.number),&amp;#039;e&amp;#039;)&lt;br /&gt;
	if self.absNnumber == INF or isNaN(self.number) or self.magnitude ==nil or math.abs(self.magnitude) == INF then&lt;br /&gt;
		ret[#ret + 1] = string.gsub(self.rawNumberString, &amp;#039;-&amp;#039;, MINUS)&lt;br /&gt;
	elseif sciNotation ~= nil or math.abs(self.magnitude) &amp;gt;= 9 then&lt;br /&gt;
		ret[#ret + 1] = self.sign&lt;br /&gt;
		if self.format == &amp;#039;yes&amp;#039; then&lt;br /&gt;
			ret[#ret + 1] = lang:formatNum(math.abs(self.number * 10^-self.magnitude))&lt;br /&gt;
		else&lt;br /&gt;
			ret[#ret + 1] = math.abs(self.number * 10^-self.magnitude)&lt;br /&gt;
		end&lt;br /&gt;
		ret[#ret + 1] = &amp;#039;&amp;lt;span style=&amp;quot;margin-left:0.2em&amp;quot;&amp;gt;×&amp;lt;span style=&amp;quot;margin-left:0.1em&amp;quot;&amp;gt;10&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;s style=&amp;quot;display:none&amp;quot;&amp;gt;^&amp;lt;/s&amp;gt;&amp;lt;sup&amp;gt;&amp;#039;&lt;br /&gt;
		if self.magnitude&amp;lt;0 then&lt;br /&gt;
			ret[#ret + 1] = MINUS .. (-self.magnitude)&lt;br /&gt;
		else&lt;br /&gt;
			ret[#ret + 1] = self.magnitude&lt;br /&gt;
		end&lt;br /&gt;
		ret[#ret + 1] = &amp;#039;&amp;lt;/sup&amp;gt;&amp;#039;&lt;br /&gt;
	else&lt;br /&gt;
		ret[#ret + 1] = self.sign&lt;br /&gt;
		if self.format == &amp;#039;yes&amp;#039; then&lt;br /&gt;
			ret[#ret + 1] = Math._precision_format(self.absNumber, self.precision)&lt;br /&gt;
		else&lt;br /&gt;
			local newPrecision = Math._precision(self.absNumber)&lt;br /&gt;
			ret[#ret + 1] = tostring(self.absNumber)&lt;br /&gt;
			if newPrecision &amp;lt; self.precision then&lt;br /&gt;
				if self.integer == self.absNumber then&lt;br /&gt;
					ret[#ret + 1] = &amp;#039;.&amp;#039;&lt;br /&gt;
				end&lt;br /&gt;
				ret[#ret + 1] = string.rep(&amp;#039;0&amp;#039;, math.min(12, self.precision - newPrecision) )&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
    return table.concat(ret) &lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Nts:makeSortKey()&lt;br /&gt;
	return SortKey._sortKeyForNumber(self.number) .. &amp;#039;♠&amp;#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function ifNaNThen(n,p)&lt;br /&gt;
	if isNaN(n) then&lt;br /&gt;
		return p&lt;br /&gt;
	end&lt;br /&gt;
	return n&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function isNaN(n)&lt;br /&gt;
	return n ~= n&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Nts:renderTrackingCategories()&lt;br /&gt;
	if self.hasDeprecatedParameters then&lt;br /&gt;
		return &amp;#039;[[Category:Nts templates with deprecated parameters]]&amp;#039;&lt;br /&gt;
	else&lt;br /&gt;
		return &amp;#039;&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Nts:__tostring()&lt;br /&gt;
	local root = mw.html.create()&lt;br /&gt;
	local span = root:tag(&amp;#039;span&amp;#039;)&lt;br /&gt;
		:attr(&amp;#039;data-sort-value&amp;#039;, self:makeSortKey())&lt;br /&gt;
&lt;br /&gt;
	if self.debug == &amp;#039;yes&amp;#039; then&lt;br /&gt;
		span:tag(&amp;#039;span&amp;#039;)&lt;br /&gt;
			:css(&amp;#039;border&amp;#039;, &amp;#039;1px solid&amp;#039;)&lt;br /&gt;
			:wikitext(self:makeSortKey())&lt;br /&gt;
	elseif self.quiet ~= &amp;#039;no&amp;#039; then&lt;br /&gt;
		span:css(&amp;#039;display&amp;#039;, &amp;#039;none&amp;#039;)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Display&lt;br /&gt;
	if self.quiet == &amp;#039;no&amp;#039; then&lt;br /&gt;
		span:wikitext(self:makeDisplay())&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Tracking categories&lt;br /&gt;
	root:wikitext(self:renderTrackingCategories())&lt;br /&gt;
&lt;br /&gt;
	return tostring(root)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- Exports&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
function p._exportClasses()&lt;br /&gt;
	return {&lt;br /&gt;
		Nts = Nts&lt;br /&gt;
	}&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p._main(args)&lt;br /&gt;
	local success, ret = pcall(function ()&lt;br /&gt;
		local nts = Nts.new(args)&lt;br /&gt;
		return tostring(nts)&lt;br /&gt;
	end)&lt;br /&gt;
	if success then&lt;br /&gt;
		return ret&lt;br /&gt;
	else&lt;br /&gt;
		ret = string.format(&lt;br /&gt;
			&amp;#039;&amp;lt;strong class=&amp;quot;error&amp;quot;&amp;gt;Error in [[Template:Nts]]: %s&amp;lt;/strong&amp;gt;&amp;#039;,&lt;br /&gt;
			ret&lt;br /&gt;
		)&lt;br /&gt;
		if mw.title.getCurrentTitle().namespace == 0 then&lt;br /&gt;
			-- Only categorise in the main namespace&lt;br /&gt;
			ret = ret .. &amp;#039;[[Category:Nts templates with errors]]&amp;#039;&lt;br /&gt;
		end&lt;br /&gt;
		return ret&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.main(frame)&lt;br /&gt;
	local args = require(&amp;#039;Module:Arguments&amp;#039;).getArgs(frame, {&lt;br /&gt;
		wrappers = { &amp;#039;Template:Number table sorting&amp;#039; },&lt;br /&gt;
	})&lt;br /&gt;
	return p._main(args)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Caleb Cooper</name></author>
	</entry>
</feed>