Nicht angemeldeter Benutzer - Bearbeiten von Seiten ist nur als angemeldeter Benutzer möglich.
Modul:Sort: Unterschied zwischen den Versionen
Zur Navigation springen
Zur Suche springen
(Setup) |
(update) |
||
Zeile 1: | Zeile 1: | ||
− | --[=[ 2013-10- | + | --[=[ 2013-10-21 |
Sort | Sort | ||
]=] | ]=] | ||
Zeile 57: | Zeile 57: | ||
elseif c == min1 or c == min2 then -- grouping | elseif c == min1 or c == min2 then -- grouping | ||
else | else | ||
− | + | i = j | |
break -- for j | break -- for j | ||
end | end | ||
+ | i = n | ||
end -- for j | end -- for j | ||
− | |||
last = true | last = true | ||
elseif lead then | elseif lead then | ||
Zeile 79: | Zeile 79: | ||
if i < n then | if i < n then | ||
suffix = mw.ustring.sub( source, i ) | suffix = mw.ustring.sub( source, i ) | ||
+ | if c == 69 or c == 101 then -- E e | ||
+ | local s = suffix:match( "^[Ee](-?%d+)" ) | ||
+ | if s then | ||
+ | j = tonumber( s ) | ||
+ | sub = sub:sub( 2 ) | ||
+ | suffix = suffix:sub( #s + 2 ) | ||
+ | if j > 0 then | ||
+ | if j > #sub then | ||
+ | sub = sub .. string.rep( "0", j - #sub ) | ||
+ | end | ||
+ | r = r .. sub:sub( 1, j ) | ||
+ | sub = sub:sub( j + 1 ) | ||
+ | elseif j < 0 then | ||
+ | j = - j | ||
+ | if j > #r then | ||
+ | r = string.rep( "0", j - #r ) .. r | ||
+ | end | ||
+ | sub = r:sub( - j ) .. sub | ||
+ | r = r:sub( 1, #r - j ) | ||
+ | end | ||
+ | sub = "." .. sub | ||
+ | end | ||
+ | end | ||
end | end | ||
break -- for i | break -- for i | ||
Zeile 123: | Zeile 146: | ||
local p = { } | local p = { } | ||
− | p. | + | p.Tlatin = function ( frame ) |
− | -- Template:: | + | -- Template::latin |
-- {{{1}}} | -- {{{1}}} | ||
return "not yet ready" | return "not yet ready" | ||
− | end -- p. | + | end -- p.Tlatin |
Zeile 147: | Zeile 170: | ||
-- z -- number of leading zeros / maximum length; defaults to 15 | -- z -- number of leading zeros / maximum length; defaults to 15 | ||
-- m -- negative figures by digits; default: by value | -- m -- negative figures by digits; default: by value | ||
− | |||
− | |||
− | |||
− | |||
local lucky, r = pcall( Sort.num, | local lucky, r = pcall( Sort.num, | ||
frame:getParent().args[ 1 ] or "", | frame:getParent().args[ 1 ] or "", | ||
Zeile 156: | Zeile 175: | ||
frame.args.t, | frame.args.t, | ||
tonumber( frame.args.z ), | tonumber( frame.args.z ), | ||
− | m == "1" ) | + | frame.args.m == "1" ) |
-- DEBUG: | -- DEBUG: | ||
if not lucky then | if not lucky then | ||
− | r = "<span class= | + | r = "<span class=\"error\">" .. r .. "</span>" |
end | end | ||
return r; | return r; |
Version vom 24. Oktober 2013, 23:49 Uhr
Die Dokumentation für dieses Modul kann unter Modul:Sort/Doku erstellt werden
--[=[ 2013-10-21
Sort
]=]
local Sort = { }
Sort.num = function ( adjust, ad, at, align, absolute )
-- Build sortkey for heading numerical value
-- Precondition:
-- adjust -- string to be aligned; leading digits / minus
-- ad -- decimal separator; "." or ","; defaults to "."
-- at -- thousands group separator; defaults to none
-- "," "." "'"
-- align -- number of leading zeros / maximum length
-- defaults to 15
-- absolute -- negative figures by digits; default: by value
-- Postcondition:
-- Returns string with sortkey
local max = 15
local mid = 46 -- "."
local min1 = -1 -- none
local min2 = -2 -- none
local low = false
local last = false
local lead = true
local source = tostring( adjust )
local sub = "."
local suffix = false
local n = mw.ustring.len( source )
local r = ""
local c
if ad then
mid = mw.ustring.codepoint( ad, 1 )
end
if at then
min1, min2 = mw.ustring.codepoint( at, 1, 2 )
end
if align then
max = align
end
for i = 1, n do
c = mw.ustring.codepoint( source, i )
if c > 32 then -- not whitespace
if c >= 48 and c <= 57 then -- digits
r = string.format( "%s%c", r, c )
max = max - 1
elseif c == min1 or c == min2 then -- group separator
elseif c == mid then -- decimal separator
for j = i + 1, n do
c = mw.ustring.codepoint( source, j )
if c >= 48 and c <= 57 then -- digits
sub = string.format( "%s%c", sub, c )
elseif c == min1 or c == min2 then -- grouping
else
i = j
break -- for j
end
i = n
end -- for j
last = true
elseif lead then
if c == 45 or c == 8722 then -- minus
low = true
elseif c ~= 43 then -- plus
last = true
end
else
last = true
end
lead = false
elseif not lead then -- whitespace not leading
last = true
end
if last then
if i < n then
suffix = mw.ustring.sub( source, i )
if c == 69 or c == 101 then -- E e
local s = suffix:match( "^[Ee](-?%d+)" )
if s then
j = tonumber( s )
sub = sub:sub( 2 )
suffix = suffix:sub( #s + 2 )
if j > 0 then
if j > #sub then
sub = sub .. string.rep( "0", j - #sub )
end
r = r .. sub:sub( 1, j )
sub = sub:sub( j + 1 )
elseif j < 0 then
j = - j
if j > #r then
r = string.rep( "0", j - #r ) .. r
end
sub = r:sub( - j ) .. sub
r = r:sub( 1, #r - j )
end
sub = "." .. sub
end
end
end
break -- for i
end
end -- for i
if low then
if not absolute then -- complementary value
local s = "."
local cmpl = function ( str, k )
return 57 - str:byte( k )
end
for i = 2, #sub do
s = string.format( "%s%d", s, cmpl( sub, i ) )
end -- for i
for i = #r, 1, -1 do
s = string.format( "%d%s", cmpl( r, i ), s )
end -- for i--
r = s
if max > 0 then
r = string.rep( "9", max ) .. r
end
sub = false
max = 0
end
end
if sub then
r = r .. sub
end
if max > 0 then
r = string.rep( "0", max ) .. r
end
if low then
r = "-" .. r
end
if suffix then
r = string.format( "%s %s", r, suffix )
end
return r
end -- Sort.num()
-- Export
local p = { }
p.Tlatin = function ( frame )
-- Template::latin
-- {{{1}}}
return "not yet ready"
end -- p.Tlatin
p.Td = function ( frame )
-- Template::date
-- {{{1}}}
return "not yet ready"
end -- p.Td
p.Tn = function ( frame )
-- Template::numerical
-- {{{1}}}
-- #invoke
-- d -- decimal separator; defaults to "."
-- t -- thousands group separator; defaults to none
-- z -- number of leading zeros / maximum length; defaults to 15
-- m -- negative figures by digits; default: by value
local lucky, r = pcall( Sort.num,
frame:getParent().args[ 1 ] or "",
frame.args.d,
frame.args.t,
tonumber( frame.args.z ),
frame.args.m == "1" )
-- DEBUG:
if not lucky then
r = "<span class=\"error\">" .. r .. "</span>"
end
return r;
end -- p.Tn
p.Sort = function ()
return Sort
end -- p.Sort
return p