<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="nb">
	<id>https://www.wikisida.no/index.php?action=history&amp;feed=atom&amp;title=Modul%3ASorterbart_tall</id>
	<title>Modul:Sorterbart tall - Sideversjonshistorikk</title>
	<link rel="self" type="application/atom+xml" href="https://www.wikisida.no/index.php?action=history&amp;feed=atom&amp;title=Modul%3ASorterbart_tall"/>
	<link rel="alternate" type="text/html" href="https://www.wikisida.no/index.php?title=Modul:Sorterbart_tall&amp;action=history"/>
	<updated>2026-04-20T02:28:24Z</updated>
	<subtitle>Versjonshistorikk for denne siden på wikien</subtitle>
	<generator>MediaWiki 1.45.1</generator>
	<entry>
		<id>https://www.wikisida.no/index.php?title=Modul:Sorterbart_tall&amp;diff=211&amp;oldid=prev</id>
		<title>nb&gt;Jon Harald Søby: gjør at malen bruker en &lt;span&gt; med data-sort-value i stedet for en skjult &lt;span&gt;</title>
		<link rel="alternate" type="text/html" href="https://www.wikisida.no/index.php?title=Modul:Sorterbart_tall&amp;diff=211&amp;oldid=prev"/>
		<updated>2018-11-13T22:18:21Z</updated>

		<summary type="html">&lt;p&gt;gjør at malen bruker en &amp;lt;span&amp;gt; med data-sort-value i stedet for en skjult &amp;lt;span&amp;gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Ny side&lt;/b&gt;&lt;/p&gt;&lt;div&gt;local getArgs = require(&amp;#039;Module:Arguments&amp;#039;).getArgs&lt;br /&gt;
local yesno = require(&amp;#039;Module:Yesno&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
local languageEnglish = mw.getLanguage(&amp;#039;en&amp;#039;)&lt;br /&gt;
-- local languageNorwegian = mw.getLanguage(&amp;#039;no&amp;#039;)&lt;br /&gt;
local languageNorwegian = mw.getContentLanguage()&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
-- Returns the magnitude of a number defined as the integer part of log10 of the absolute value of the number&lt;br /&gt;
-- Equivalent to [[Mal:Magnitude]]&lt;br /&gt;
function p.magnitude(number)&lt;br /&gt;
	if number == 0 then return nil end&lt;br /&gt;
	return math.floor(math.log10(math.abs(number)))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Returns a sorting key for a number&lt;br /&gt;
function p.sortableNumber(number)&lt;br /&gt;
	local result = &amp;#039;&amp;#039;&lt;br /&gt;
	if number &amp;gt; 0 then&lt;br /&gt;
		result = result .. &amp;#039;3&amp;amp;&amp;#039; .. tostring(500 + p.magnitude(number))&lt;br /&gt;
	elseif number &amp;lt; 0 then&lt;br /&gt;
		result = result .. &amp;#039;1&amp;amp;&amp;#039; .. tostring(500 - p.magnitude(number))&lt;br /&gt;
	else -- 0&lt;br /&gt;
		result = result .. &amp;#039;2&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	if number &amp;gt;= 0 then&lt;br /&gt;
		result = result .. &amp;#039;&amp;amp;&amp;#039; .. tostring(number)&lt;br /&gt;
	else -- negative&lt;br /&gt;
		result = result .. &amp;#039;&amp;amp;&amp;#039; .. tostring(100000 * (10 + number / 10 ^ p.magnitude(number)))&lt;br /&gt;
	end&lt;br /&gt;
	return result .. &amp;#039;&amp;amp;&amp;#039;;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Returns a sortable string of a number (but without the number)&lt;br /&gt;
-- Argument displayCode is optional&lt;br /&gt;
-- Equivalent to [[Mal:Sorterbart tall skjult]]&lt;br /&gt;
function p.sortableNumberFormat1(number, displayCode)&lt;br /&gt;
	if number == nil then return &amp;#039;&amp;#039; end&lt;br /&gt;
	local result = &amp;#039;&amp;lt;span data-sort-value=&amp;quot;&amp;#039; .. p.sortableNumber(number) .. &amp;#039;&amp;quot;&amp;gt;&amp;#039;&lt;br /&gt;
	if displayCode then&lt;br /&gt;
		result = result .. &amp;#039;&amp;lt;code&amp;gt;&amp;#039; .. p.sortableNumber(number) .. &amp;#039;&amp;lt;/code&amp;gt; &amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	return result&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Returns number of decimals in a numeric string&lt;br /&gt;
local function numberOfDecimals(numstr)&lt;br /&gt;
	local idx1, idx2, decStr = string.find(numstr, &amp;#039;.*[,%.](.*)&amp;#039;) -- Find last occurence of &amp;#039;,&amp;#039; or &amp;#039;.&amp;#039; (the decimal separation sign)&lt;br /&gt;
	if not decStr then return 0 end&lt;br /&gt;
	return #decStr&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Returns a sortable string with a formatted number&lt;br /&gt;
-- Arguments preStr, postStr, positiveSign, decimals and displayCode are optional&lt;br /&gt;
-- Equivalent to [[Mal:Sorterbart tall]]&lt;br /&gt;
function p.sortableNumberFormat2(number, preStr, postStr, positiveSign, decimals, displayCode)&lt;br /&gt;
	if number == nil then return &amp;#039;&amp;#039; end&lt;br /&gt;
	local preStr_ = preStr or &amp;#039;&amp;#039;&lt;br /&gt;
	local postStr_ = postStr or &amp;#039;&amp;#039;&lt;br /&gt;
	local formattedNumber = languageNorwegian:formatNum(number)&lt;br /&gt;
	formattedNumber = string.gsub(formattedNumber, &amp;#039;-&amp;#039;, &amp;#039;−&amp;#039;) -- Replace hyphen with minus&lt;br /&gt;
	local expIdx = string.find(formattedNumber, &amp;#039;E&amp;#039;)&lt;br /&gt;
	if expIdx then&lt;br /&gt;
		local base = string.sub(formattedNumber, 1, expIdx - 1)&lt;br /&gt;
		local exp = string.sub(formattedNumber, expIdx + 1)&lt;br /&gt;
		exp = string.gsub(exp, &amp;#039;+&amp;#039;, &amp;#039;&amp;#039;) -- Remove plus sign in exponent&lt;br /&gt;
		formattedNumber = base .. &amp;#039; · 10&amp;lt;sup&amp;gt;&amp;#039; .. exp .. &amp;#039;&amp;lt;/sup&amp;gt;&amp;#039;&lt;br /&gt;
	elseif decimals and decimals &amp;gt; 0 then -- Only try to maintain number of decimals if not on exponential format&lt;br /&gt;
		local decimalsInOutput = numberOfDecimals(formattedNumber)&lt;br /&gt;
		local diffDecimals = decimals - decimalsInOutput&lt;br /&gt;
		if diffDecimals &amp;gt; 0 then -- Pad output with zeros in order to maintain number of decimals&lt;br /&gt;
			if decimalsInOutput == 0 then -- No decimals in output: Add decimal separation character&lt;br /&gt;
				formattedNumber = formattedNumber .. &amp;#039;,&amp;#039;&lt;br /&gt;
			end&lt;br /&gt;
			formattedNumber = formattedNumber .. string.rep(&amp;#039;0&amp;#039;, diffDecimals)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if positiveSign and number &amp;gt; 0 then -- Display plus sign for positive numbers?&lt;br /&gt;
		formattedNumber = &amp;#039;+&amp;#039; .. formattedNumber&lt;br /&gt;
	end&lt;br /&gt;
	return p.sortableNumberFormat1(number, displayCode) .. preStr_ .. formattedNumber .. postStr_ .. &amp;#039;&amp;lt;/span&amp;gt;&amp;#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Converts and returns a numeric string to a number.&lt;br /&gt;
-- Tries first to interpret the number as Norwegian then as English&lt;br /&gt;
-- Returns nil if no success&lt;br /&gt;
local function strToNumber(numstr)&lt;br /&gt;
	if not numstr or #numstr == 0 then return nil end&lt;br /&gt;
	local number = languageNorwegian:parseFormattedNumber(numstr) -- Try first Norwegian formatting&lt;br /&gt;
	if not number then -- Not recognized as Norwegian, try English&lt;br /&gt;
		number = languageEnglish:parseFormattedNumber(numstr)&lt;br /&gt;
	end&lt;br /&gt;
	if not number then&lt;br /&gt;
		number = tonumber(numstr) -- This is a (very) long shot&lt;br /&gt;
	end&lt;br /&gt;
	if not number then&lt;br /&gt;
		error(&amp;#039;Uttrykksfeil: «&amp;#039; .. numstr .. &amp;#039;» blir ikke tolket som en numerisk verdi&amp;#039;, 0)&lt;br /&gt;
	end&lt;br /&gt;
	return number&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Converts numeric string to a number.&lt;br /&gt;
-- Checks if a positive number is prefixed with a plus sign&lt;br /&gt;
-- Returns number, state of sign and number of decimals in number&lt;br /&gt;
local function decodeNumberArg(numstr)&lt;br /&gt;
	local number = strToNumber(numstr)&lt;br /&gt;
	if not number then return nil, nil end&lt;br /&gt;
	&lt;br /&gt;
	local positiveSign = false&lt;br /&gt;
	if number &amp;gt; 0 then -- Check if numstr string begins with &amp;#039;+&amp;#039;: Interpret this as sign for a positive number is wanted in output&lt;br /&gt;
		positiveSign = string.match(numstr, &amp;#039;^%+&amp;#039;) ~= nil&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- Check number of decimals in input in order to try to maintain same number of decimals in output&lt;br /&gt;
	local decimals = numberOfDecimals(numstr)&lt;br /&gt;
	&lt;br /&gt;
	return number, positiveSign, decimals&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function displayCodeParse(arg)&lt;br /&gt;
	if not arg then return false end -- Missing arg: Default is hide&lt;br /&gt;
	if #arg == 0 then return true end -- Empty arg: Interpret as display (due to legacy template)&lt;br /&gt;
	if string.match(arg, &amp;#039;display *: *none&amp;#039;) then return false end -- Default arg from legacy template&lt;br /&gt;
	return yesno(arg)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- To be used from a template. Uses args from parent to template&lt;br /&gt;
-- Arguments from parent:&lt;br /&gt;
--		1 The number&lt;br /&gt;
--		2 Optional boolean: If true then display the code generated&lt;br /&gt;
-- Returns a sortable string of a number (but without the number)&lt;br /&gt;
-- Equivalent to [[Mal:Sorterbart tall skjult]]&lt;br /&gt;
function p.formatHidden(frame)&lt;br /&gt;
	local args = getArgs(frame:getParent().args, {trim = true, removeBlanks = false, parentFirst = true})&lt;br /&gt;
	return p.sortableNumberFormat1(strToNumber(args[1]), displayCodeParse(args[2])) .. &amp;#039;&amp;lt;/span&amp;gt;&amp;#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Same as formatHidden, but should be used directly with #invoke&lt;br /&gt;
function p.formatHidden0(frame)&lt;br /&gt;
	local args = getArgs(frame.args, {trim = true, removeBlanks = false, parentFirst = true})&lt;br /&gt;
	return p.sortableNumberFormat1(strToNumber(args[1]), displayCodeParse(args[2])) .. &amp;#039;&amp;lt;/span&amp;gt;&amp;#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- To be used from a template. Uses args from parent to template&lt;br /&gt;
-- Arguments from parent:&lt;br /&gt;
--		1 The number&lt;br /&gt;
--		2 Optional prefix&lt;br /&gt;
--		3 Optional postfix&lt;br /&gt;
--		4 Optional boolean: If true then display the code generated&lt;br /&gt;
-- Returns a sortable string with a formatted number&lt;br /&gt;
-- Equivalent to [[Mal:Sorterbart tall]]&lt;br /&gt;
function p.format(frame)&lt;br /&gt;
	local args = getArgs(frame:getParent().args, {trim = true, removeBlanks = false, parentFirst = true})&lt;br /&gt;
	if not args[1] then error(&amp;#039;Uttrykksfeil: Argument for tall mangler&amp;#039;, 0)	end&lt;br /&gt;
	local numstr =  string.gsub(args[1], &amp;#039; &amp;#039;, &amp;#039;&amp;#039;) -- Remove any spaces in number input&lt;br /&gt;
	local number, positiveSign, decimals = decodeNumberArg(numstr)&lt;br /&gt;
	if not number then return args[1] end&lt;br /&gt;
	return p.sortableNumberFormat2(number, args[2], args[3], positiveSign, decimals, displayCodeParse(args[4]))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Same as format, but should be used directly with #invoke&lt;br /&gt;
function p.format0(frame)&lt;br /&gt;
	local args = getArgs(frame.args, {trim = true, removeBlanks = false, parentFirst = true})&lt;br /&gt;
	if not args[1] then error(&amp;#039;Uttrykksfeil: Argument for tall mangler&amp;#039;, 0)	end&lt;br /&gt;
	local numstr =  string.gsub(args[1], &amp;#039; &amp;#039;, &amp;#039;&amp;#039;) -- Remove any spaces in number input&lt;br /&gt;
	local number, positiveSign, decimals = decodeNumberArg(numstr)&lt;br /&gt;
	if not number then return args[1] end&lt;br /&gt;
	return p.sortableNumberFormat2(number, args[2], args[3], positiveSign, decimals, displayCodeParse(args[4]))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>nb&gt;Jon Harald Søby</name></author>
	</entry>
</feed>