Module:NumberSpell
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
{{#invoke:NumberSpell|main|number}}
Examples
{{#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