Module:Ordinal: Difference between revisions
creating a much needed module |
remove comments referring to nonexistent pages |
||
| (3 intermediate revisions by 3 users not shown) | |||
| Line 1: | Line 1: | ||
local p = {} | |||
--[[ | |||
This function converts an integer value into a numeral followed by ordinal indicator. | |||
The output string might contain HTML tags. | |||
Usage: | |||
{{#invoke: Ordinal|ordinal|1=|2=}} | |||
{{#invoke: Ordinal|ordinal}} - uses the caller's parameters | |||
Parameters | |||
1: Any number or string. | |||
2: Set to "d" if the module should display "d" instead of "nd" and "rd". | |||
Parameters | |||
]] | ]] | ||
function p.ordinal(frame) | function p.ordinal(frame) | ||
local args = frame.args | local args = frame.args | ||
if args[1] == nil then | |||
args = frame:getParent().args | |||
end | |||
if args[1] == nil then | |||
args[1] = "{{{1}}}" | |||
end | |||
return p._ordinal(args[1], (args[2] == "d")) | |||
end | end | ||
function p._ordinal(n, d | function p._ordinal(n, d) | ||
local x = tonumber(mw.ustring.match(n, "(%d*)%W*$")) | local x = tonumber(mw.ustring.match(n, "(%d*)%W*$")) | ||
local suffix = "th" | local suffix = "th" | ||
| Line 43: | Line 31: | ||
local mod10 = math.abs(x) % 10 | local mod10 = math.abs(x) % 10 | ||
local mod100 = math.abs(x) % 100 | local mod100 = math.abs(x) % 100 | ||
if | if mod10 == 1 and mod100 ~= 11 then | ||
suffix = "st" | suffix = "st" | ||
elseif mod10 == 2 and mod100 ~= 12 then | elseif mod10 == 2 and mod100 ~= 12 then | ||
if d then suffix = "d" else suffix = "nd" end | if d then | ||
suffix = "d" | |||
else | |||
suffix = "nd" | |||
end | |||
elseif mod10 == 3 and mod100 ~= 13 then | elseif mod10 == 3 and mod100 ~= 13 then | ||
if d then suffix = "d" else suffix = "rd" end | if d then | ||
suffix = "d" | |||
else | |||
suffix = "rd" | |||
end | |||
end | end | ||
end | end | ||
return n .. suffix | return n .. suffix | ||