Edge Rewrite
// HTMLRewriter · presentation

This page was redesigned at the edge.

Cloudflare fetched the original article and streamed it through HTMLRewriter to apply an entirely new visual system without rebuilding the source page.

Jump to content

Module:Spellnum per MOS

Permanently protected module
From Wikipedia, the free encyclopedia

local p = {}
local words = {"thousand", "million", "billion", "trillion"} -- We don't need to go higher than this, no-one knows what an octillion is.

-- For use by other scripts. Takes arguments:
-- - 1: string or number, value to convert
-- - forcenum: string for Template:Yesno, forces a result in digits for all n ≥ 10.
-- - formating options for spellnum: zero, adj, ord, us
function p.spellnum(args)
	local frame = mw.getCurrentFrame()
	local numeral = tonumber((string.gsub(args[1], ",", "")))
    if not numeral then
        return args[1]
    end
	
    local pass_zero = "zero"
    if args['zero'] ~= nil and args['zero'] ~= '' then
    	pass_zero = args['zero']
    end
    
	-- Always return numerals for negative numbers, non-integers, and if (forcenum and numeral >= 10).
	if numeral < 0 or
			math.fmod(numeral, 1) ~= 0 or
			(numeral >= 10 and frame:expandTemplate{ title = 'yesno', args = {args['forcenum']} } == 'yes') then
		return mw.language.getContentLanguage():formatNum(numeral)
	end

	-- Convert numeral to words
	local spelled = frame:expandTemplate{ title = 'spellnum', args = {
		numeral, zero = pass_zero, adj = args['adj'], ord = args['ord'], us = args['us']}}
	
	-- Return numerals if more than two words would be needed, else return words
	if mw.ustring.find(spelled,'%a+[ %-]%a+[ %-]%a+') then
		-- Handle numbers larger than one million
		if numeral >= 1000000 and numeral <= 1000000000000000 then
			local size = math.min(4, math.floor(math.log10(numeral) / 3))
			numeral = numeral / 1000^size
			return ({"%.1f ", "%d ", "%d "})[1 + math.floor(math.log10(numeral))]:format(numeral) .. words[size]
		end
		return mw.language.getContentLanguage():formatNum(numeral)
	else 
		return spelled
	end
end

function p.main(frame)
	return p.spellnum(frame.args)
end

return p