Module:Formatnum
Jump to navigation
Jump to search
Documentation for this module may be created at Module:Formatnum/doc
-- This module is intended to replace the functionality of Template:Formatnum and related templates.
local p = {}
local digit = { -- languages not supported by the Lua of wikimedia software
["ml-old"] = { '൦', '൧', '൨', '൩', '൪', '൫', '൬', '൭', '൮', '൯' },
["mn"] = { '᠐', '᠑', '᠒', '᠓', '᠔', '᠕', '᠖', '᠗', '᠘', '᠙'},
["te"] = { '౦', '౧', '౨', '౩', '౪', '౫', '౬', '౭', '౮', '౯'},
["th"] = { '๐', '๑', '๒', '๓', '๔', '๕', '๖', '๗', '๘', '๙'}
}
function p.main(frame)
local pframe = frame:getParent()
local config = frame.args
local prec = pframe.args.prec
local number = pframe.args[1]
local lang = pframe.args[2]
local sep = pframe.args.sep or ""
if not lang or not mw.language.isSupportedLanguage(lang) then
lang = frame:preprocess( "{{int:lang}}" )
end
return p._main(number, lang, sep, prec, config)
end
function p._main(number, lang, sep, prec, config)
-- Preprocessing prec
local precNum = tonumber(prec)
if precNum ~= nil and precNum > 0 and tonumber(number) ~= nil then
if string.find(tostring(number), "%.") ~= nil then
if (string.len(number) - string.find(tostring(number), "%.")) < precNum then
precnumber = "" .. number .. string.rep("0", precNum - (string.len(number) - string.find(tostring(number), "%.")))
elseif (string.len(number) - string.find(tostring(number), "%.")) > precNum then
local proc = string.gsub(number, "0+$", "")
if (string.len(proc) - string.find(tostring(proc), "%.")) < precNum then
precnumber = proc .. string.rep("0", precNum - (string.len(proc) - string.find(tostring(proc), "%.")))
else
precnumber = proc
end
elseif (string.len(number) - string.find(tostring(number), "%.")) == precNum then
precnumber = number
end
else
precnumber = "" .. number .. "." .. string.rep("0", prec)
end
number = precnumber .. "1"
precA = "true"
end
if lang == "arabic-indic" then
lang = "ks"
end
-- Formatnum
if tonumber(number) ~= nil and mw.language.isKnownLanguageTag(lang) == true then
formatnum = mw.getLanguage( lang ):formatNum( tonumber(number) )
else
formatnum = number
formatA = "true"
end
-- Formatnum, special cases
local numsc = formatnum
if lang == "ml-old" or lang == "mn" or lang == "te" or lang == "th" then
for i, v in ipairs( digit[lang] ) do
numsc = mw.ustring.gsub(numsc, tostring(i-1), v)
end
end
--Postprocessing prec
if precA == "true" then
postprec = mw.ustring.sub(numsc, 1, (mw.ustring.len(numsc) - 1))
else
postprec = numsc
end
-- separator
if sep ~= "" and formatA ~= "true" then
local replace = mw.ustring.gsub( "", "%%", "%%%%" )
local separator = mw.ustring.sub(mw.getLanguage(lang):formatNum(tonumber("10000")), 3, 3)
if tostring(mw.ustring.find(separator, "%s")) == "1" then
pattern = mw.ustring.format(separator, "%s")
elseif tostring(mw.ustring.find(separator, "%p")) == "1" then
pattern = mw.ustring.gsub(separator, "([%(%)%.%%%+%-%*%?%[%^%$%]])", "%%%1")
else
pattern = ""
end
return tostring(mw.ustring.gsub( postprec, pattern, replace ))
else
return postprec
end
end
return p