مۆدیوول:Number to word

لە ئینسایکڵۆپیدیای ئازادی ویکیپیدیاوە
بەڵگەدارکردنی مۆدیوول[دروست بکە]
local p = {}

local convert = require('Module:Numeral converter').convert

local yekan = {
    '',
    'یەک',
    'دوو',
    'سێ',
    'چوار',
    'پێنج',
    'شەش',
    'حەوت',
    'ھەشت',
    'نۆ'}

local dahgan = {
    '',
    '',
    'بیست',
    'سی',
    'چل',
    'پەنجا',
    'شەست',
    'حەفتا',
    'ھەشتا',
    'نەوەد'}

local sadgan = {
    '',
    'سەد',
    'دووسەد',
    'سێسەد',
    'چوارسەد',
    'پێنجسەد',
    'شەسسەد',
    'حەوتسەد',
    'ھەشتسەد',
    'نۆسەد'}

local exceptions = {
    'دە',
    'یازدە',
    'دوازدە',
    'سێزدە',
    'چواردە',
    'پازدە',
    'شازدە',
    'حەڤدە',
    'ھەژدە',
    'نۆزدە'}

local scale = {
    '',
    ' ھەزار',
    ' ملیۆن',
    ' ملیار',
    ' بلیۆن',
    ' بلیارد',
    ' ترلیۆن',
    ' ترلیارد',
    ' کوادرلیۆن',
    ' کادریلیارد',
    ' کوینتیلیۆن',
    ' کوانتینیارد'}

function threedigit_words(threedigit)
    local words = ''
    if string.sub(threedigit,1,1) ~= '0' and string.sub( threedigit, 2)~='00' then    
    	words = sadgan[tonumber(string.sub(threedigit,1,1))+1] .. ' و '
	else
		words = sadgan[tonumber(string.sub(threedigit,1,1))+1]
	end
    if string.sub(threedigit,2,2) == '1' then
        words = words .. exceptions[tonumber(string.sub(threedigit,3,3))+1]
    else
		if string.sub(threedigit,3,3) ~= '0' and string.sub(threedigit,2,2)~='0' then
			words = words .. dahgan[tonumber(string.sub(threedigit,2,2))+1] .. ' و '
		else
			words = words .. dahgan[tonumber(string.sub(threedigit,2,2))+1]
		end
		words = words .. yekan[tonumber(string.sub(threedigit,3,3))+1]
	end
    return words
end

function strnum2words(strnumber)
    if tonumber(strnumber) == 0 then
        return 'سفر'
	end
    if #strnumber > #scale * 3 then
        error('لەدەرەوەی مەودایە!')
    end
	
    length = #strnumber
    
    if length%3 ~= 0 then
        strnumber = string.rep('0', 3-length%3) .. strnumber
    end
	
    groups = (#strnumber) / 3
    local words = ''
    group = groups
    while group > 0 do
        threedigit = string.sub( strnumber, group*3-2, group*3)
        word3 = threedigit_words(threedigit)
        if word3 ~= '' and group ~= groups then
            if words == '' then
                words = word3 .. scale[groups-group+1]
            else
                words = word3 .. scale[groups-group+1] .. ' و ' .. words
			end
        else
            words = word3 .. words
		end
        group = group - 1
	end
	
    return sign.. words
end

function ordinal(nubmer)
    words = strnum2words(nubmer)
    if mw.ustring.sub(words,-2) == 'سێ' then
        words = words:gsub('سێ$', 'سێیەم')
    elseif mw.ustring.sub(words,-2) == 'نۆ' then
        words = words:gsub('نۆ$', 'نۆیەم')
    else
        words = words .. 'ەم'
    end
    return words
end

function ordinal2(nubmer)
    words = strnum2words(nubmer)
    if mw.ustring.sub(words,-2) == 'سێ' then
        words = words:gsub('سێ$', 'سێیەمین')
    elseif mw.ustring.sub(words,-2) == 'نۆ' then
        words = words:gsub('نۆ$', 'نۆیەمین')
    else
        words = words .. 'ەمین'
    end
    return words
end


function p.run(frame)
    local args = frame.args
	number = mw.ustring.match(convert("en",args[1]), "(%d*)%W*$")
	if string.sub(number,1,1) == '-' or string.sub(number,1,1) == '−' then
		sign = 'سالب '
		number = mw.text.trim(string.sub(number,2))
	else
		sign = ''
	end
	if args[2] == 'ەم' then
		return ordinal(number)
	elseif args[2] == 'ەمین' then
		return ordinal2(number)
	else
		return strnum2words(number)
	end
end
 
return p