Documentation for this module may be created at Module:Sandbox/Dalba/Num2wordfa/doc

yekan = {'',
         'یک',
         'دو',
         'سه',
         'چهار',
         'پنج',
         'شش',
         'هفت',
         'هشت',
         'نه'}

dahgan = {'',
          '',
          'بیست',
          'سی',
          'چهل',
          'پنجاه',
          'شصت',
          'هفتاد',
          'هشتاد',
          'نود'}

sadgan = {'',
          'یکصد',
          'دویست',
          'سیصد',
          'چهارصد',
          'پانصد',
          'ششصد',
          'هفتصد',
          'هشتصد',
          'نهصد'}

exceptions = {'ده',
              'یازده',
              'دوازده',
              'سیزده',
              'چهارده',
              'پانزده',
              'شانزده',
              'هفده',
              'هجده',
              'نوزده'}
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
        print ('Out of range!')
    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
        return mw.ustring.sub(words,0,-2) .. 'سوم'
    else
        return sign.. words .. 'م'
	end
end

function ordinal2(nubmer)
    words = strnum2words(nubmer)
    if mw.ustring.sub(words,-2) == 'سه' then
        return sign .. mw.ustring.sub(words,0,-2) .. 'سومین'
    else
        return sign .. words .. 'مین'
	end
end
 
local p = {}
 
function p.run(frame)
	number = mw.text.trim(frame.args[1])
	if string.sub(number,1,1) == '-' then
		sign = 'منفی '
		number = mw.text.trim(string.sub(number,2))
	else
		sign = ''
	end
	if frame.args[2] == 'م' then
		return ordinal(number)
	elseif frame.args[2] == 'مین' then
		return ordinal2(number)
	else
		return strnum2words(number)
	end
end
 
return p