Module:NumberSpell
| Protected | This module is subject to page protection. It is a highly visible module in use by a very large number of pages, or is substituted very frequently. Because vandalism or mistakes would affect many pages, and even trivial editing might cause substantial load on the servers, it is protected from editing. | 
This module takes a number and returns the equivalent English word. For example, "2" becomes "two" and "79" becomes "seventy-nine". Numbers must be integers between 0 and 100.
Usage edit source
{{#invoke:NumberSpell|main|number}}
Examples edit source
{{#invoke:NumberSpell|main|8}}→ eight{{#invoke:NumberSpell|main|56}}→ fifty-six{{#invoke:NumberSpell|main|101}}→ Error: input must be an integer between 0 and 100
-- This module converts a number into its written English form.
-- For example, "2" becomes "two", and "79" becomes "seventy-nine".
local getArgs = require('Module:Arguments').getArgs
local p = {}
local max = 100 -- The maximum number that can be parsed.
local ones = {
	[0] = 'zero',
	[1] = 'one',
	[2] = 'two',
	[3] = 'three',
	[4] = 'four',
	[5] = 'five',
	[6] = 'six',
	[7] = 'seven',
	[8] = 'eight',
	[9] = 'nine'
}
local specials = {
	[10] = 'ten',
	[11] = 'eleven',
	[12] = 'twelve',
	[13] = 'thirteen',
	[15] = 'fifteen',
	[18] = 'eighteen',
	[20] = 'twenty',
	[30] = 'thirty',
	[40] = 'forty',
	[50] = 'fifty',
	[60] = 'sixty',
	[70] = 'seventy',
	[80] = 'eighty',
	[90] = 'ninety',
	[100] = 'one hundred'
}
local formatRules = {
	{num = 90, rule = 'ninety-%s'},
	{num = 80, rule = 'eighty-%s'},
	{num = 70, rule = 'seventy-%s'},
	{num = 60, rule = 'sixty-%s'},
	{num = 50, rule = 'fifty-%s'},
	{num = 40, rule = 'forty-%s'},
	{num = 30, rule = 'thirty-%s'},
	{num = 20, rule = 'twenty-%s'},
	{num = 10, rule = '%steen'}
}
function p.main(frame)
	local args = getArgs(frame)
	local num = tonumber(args[1])
	local success, result = pcall(p._main, num)
	if success then
		return result
	else
		return string.format('<strong class="error">Error: %s</strong>', result) -- "result" is the error message.
	end
	return p._main(num)
end
function p._main(num)
	if type(num) ~= 'number' or math.floor(num) ~= num or num < 0 or num > max then
		error('input must be an integer between 0 and ' .. tostring(max), 2)
	end
	-- Check for numbers from 0 to 9.
	local onesVal = ones[num]
	if onesVal then
		return onesVal
	end
	-- Check for special numbers.
	local specialVal = specials[num]
	if specialVal then
		return specialVal
	end
	-- Construct the number from its format rule.
	onesVal = ones[num % 10]
	if not onesVal then
		error('Unexpected error parsing input ' .. tostring(num))
	end
	for i, t in ipairs(formatRules) do
		if num >= t.num then
			return string.format(t.rule, onesVal)
		end
	end
	error('No format rule found for input ' .. tostring(num))
end
return p