Module:Formatnum

From Wikispecies
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