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/sandbox

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
-- WARNING: zero defaults to blank which is probably not what you want.
function p.spellnum(args)
	local frame = mw.getCurrentFrame()
	local numeral = tonumber(args[1])
	
		-- Always return as digits 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

	local spelled = frame:expandTemplate{ title = 'spellnum', args = {
		numeral, zero = args['zero'], adj = args['adj'], ord = args['ord'], us = args['us']}}
	
	if mw.ustring.find(spelled,'%a+[ %-]%a+[ %-]%a+') then
		if numeral >= 1000000 and numeral <= 1000000000000000 then
			local size = math.min(4, math.floor(math.log10(numeral) / 3))
			numeral = numeral / 1000^size
			return ({"%.2f ", "%.1f ", "%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