Module:Number to word

لاسوند لپاره ددې موډيول کېدای سی په Module:Number to word/لاسوند کي وي

local p = {}

local yekan = {
    '',
    'يو',
    'دوه',
    'دري',
    'څلور',
    'پنځه',
    'شپږ',
    'اووه',
    'اته',
    'نه'}

local dahgan = {
    '',
    '',
    'شل',
    'ديرش',
    'څلويښت',
    'پنځوس',
    'شپېته',
    'اويا',
    'اتيا',
    'نوي'}

local sadgan = {
    '',
    'يو سل',
    'دوه سوه',
    'دري سوه',
    'څلور سوه',
    'پنځه سوه',
    'شپږ سوه',
    'اووه سوه',
    'اته سوه',
    'نه سوه'}

local exceptions = {
    'لس',
    'يوولس',
    'دوولس',
    'ديارلس',
    'څوارلس',
    'پنځلس',
    'شپاړس',
    'اوولس',
    'اتلس',
    'نولس'}
	
	local exceptions2 = {
    'شل',
	'يوويشت',
	'دوه ويشت',
	'در ويشت',
	'څليرويشت',
	'پنځه ويشت',
	'شپوږويشت',
	'اووه ويشت',
	'اته ويشت',
	'نه ويشت'}

local scale = {
    '',
    ' زر',
    ' ملیون',
    ' میلیارد',
    ' بیلیون',
    ' بیلیارد',
    ' تریلیون',
    ' تريلیارد',
    ' کوآدریلیون',
    ' کادریلیارد',
    ' کوینتیلیون',
    ' کوانتینیارد'}

function threedigit_words(threedigit)
    local words = ''
    
    if threedigit == '100' then
    	return 'سل'
    end
   
    if threedigit == '003' then
    	return 'درې'
    end
    

    ---sadgan
    if string.sub(threedigit,1,1) ~= '0' and string.sub( threedigit, 2)~='00' then
    	--- 101, 125, 658 etc
    	words = sadgan[tonumber(string.sub(threedigit,1,1))+1] .. ' '
	else
		--- 100, 200, 300 etc
		words = sadgan[tonumber(string.sub(threedigit,1,1))+1]
	end

	---dahgan
	if string.sub(threedigit,2,2) == '1' then
		---dahgan 10, 11,...., 19
        words = words .. exceptions[tonumber(string.sub(threedigit,3,3))+1]	
    else
	
		if string.sub(threedigit,2,2) == '2' then
			---dahgan 20, 21,...., 29
    		words = words .. exceptions2[tonumber(string.sub(threedigit,3,3))+1]
		else
		
			if string.sub(threedigit,3,3) ~= '0' and string.sub(threedigit,2,2)~='0' then
				
				---dahgan 35, 36, 49...., 87
				words = words .. yekan[tonumber(string.sub(threedigit,3,3))+1] .. ' ' .. dahgan[tonumber(string.sub(threedigit,2,2))+1]
			else
				
				if string.sub(threedigit,2,2)~='0' then
					---dahgan 30, 40, 50...., 60
					words = words .. dahgan[tonumber(string.sub(threedigit,2,2))+1]
				else
					---dahgan 001, 002, 003...., 009
					words = words .. yekan[tonumber(string.sub(threedigit,3,3))+1]
					
				end
			end
			
		end
	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
    	if mw.ustring.sub(words,-2) == 'شل' then
    		
    		words = words:gsub('شل$', 'شلمه')
        return words
        
    	
    	else
    		return words .. 'م'
        end
	end
    
end

function ordinal2(nubmer)
    words = strnum2words(nubmer)
    if mw.ustring.sub(words,-2) == 'دري' then
        return mw.ustring.sub(words,0,-3) .. 'دريم'
    else
        return words .. 'مین'
	end
end

function p.run(frame)
    local args = frame.args
	number = string.match(mw.text.trim(args[1]), '-?%s*%d+')
	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