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