پودمان:Number to word

پودمان به طور دائم حفاظت‌شده است
از ویکی‌پدیا، دانشنامهٔ آزاد
توضیحات پودمان[نمایش] [ویرایش] [تاریخچه] [پاکسازی]

این پودمان عدد فارسی یا انگلیسی را گرفته و آن را به صورت نوشتهٔ فارسی تحویل می‌دهد.

استفاده

با افزودن پارامتر «م» یا «مین» هنگام فراخوانی پودمان می‌توان پاسخ را به صورت عدد ترتیبی (یکم، دوم، سوم و...) گرفت. مثال:

{{#invoke:number to word|run|999}}

می‌دهد:

نهصد و نود و نه

{{#invoke:Number to word|run|  999|م}}

می‌دهد:

نهصد و نود و نهم

(توجه کنید که عدد ورودی می‌تواند با فضای سفید آغاز شود و پودمان این را پشتیبانی می‌کند.

هم‌اکنون بزرگترین عدد قابل انتقال به پودمان ۳۶ رقمی (از ردهٔ کوانتینیارد) خواهد بود: (برای اطلاعات بیشتر {{نام اعداد بزرگ}} را ببینید)

{{#invoke:number to word|run|922337203685477580732132132132212239|مین}}

می‌دهد:

نهصد و بیست و دو کوانتینیارد و سیصد و سی و هفت کوینتیلیون و دویست و سه کادریلیارد و ششصد و هشتاد و پنج کوآدریلیون و چهارصد و هفتاد و هفت ترلیارد و پانصد و هشتاد تریلیون و هفتصد و سی و دو بیلیارد و یکصد و سی و دو بیلیون و یکصد و سی و دو میلیارد و یکصد و سی و دو میلیون و دویست و دوازده هزار و دویست و سی و نهمین

اعداد منفی نیز پشتیبانی می‌شوند:


{{#invoke:number to word|run|  -   100024|م}}

می‌دهد:

یکصد هزار و بیست و چهارم

(توجه کنید که بین علامت منفی و عدد پس از آن می‌تواند فاصله وجود داشته باشد)

جستارهای وابسته

  • پودمان:NumberSpell (پودمانی مشابه اما با ورودی و خروجی به زبان انگلیسی و حداکثر تا عدد ۱۰۰)

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('سه$', 'سومین')
        return words
    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