ماژول:Number to word

ویکی‌پدیادان، آچیق بیلیک‌لیک‌دن

بو ماژول اوچون بلگه‌لر ماژول: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('سه$', 'سوم')
        return words
    else
        return words .. 'نجی'
	end
end

function ordinal2(nubmer)
    words = strnum2words(nubmer)
    if mw.ustring.sub(words,-2) == 'اۆچ' then
        words = words:gsub('اۆچ$', 'اۆچونجو')
    else
        return words .. 'جو/جی'
	end
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