Difference between revisions of "Module:NumberSpell"

From eVision
Jump to: navigation, search
m (Protected Module:NumberSpell: High-risk Lua module: used in Module:TimeAgo ([Edit=Allow only template editors and admins] (indefinite) [Move=Allow only template editors and admins] (indefinite)))
 
m (1 revision)
 
Line 1: Line 1:
−
-- 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
 

Latest revision as of 13:01, 17 July 2014

Documentation for this module may be created at Module:NumberSpell/doc