Модуль:Math

{{i}} Документація модуля[перегляд] [редагувати] [історія] [очистити кеш]


Цей модуль забезпечує ряд математичних функцій. Ці функції можуть використовуватися з #invoke чи іншими модулями Lua.

Використання з іншим модулем Lua

Щоб використовувати цей модуль на звичайних вікісторінках, спеціальні знання не потрібні. Якщо ви використовуєте цей модуль з іншим модулем Lua, то вам спочатку потрібно його завантажити як на прикладі:

local mm = require('Module:Math')

(Змінна mm розшифровується як Module Math; за бажанням ви можете вибрати щось більш описове.)

Більшість функцій модуля є у версії для Lua й у версії для #invoke. Можна використовувати функції #invoke з іншими модулями Lua, але використання функції Lua має перевагу в тому, що вам не потрібно отримувати доступ до Lua frame object. Функціям Lua передує _, тоді як #invoke функцій немає.

random

Див. також: en:Module:Random
{{#invoke:math|random}}
{{#invoke:math|random|max_value}}
{{#invoke:math|random|min_value|max_value}}
mm._random()
mm._random(max_value)
mm._random(min_value, max_value)

Генерує випадкове число.

  • Якщо аргументи не вказані, то згенероване число більше або дорівнює 0 і менше ніж 1.
  • Якщо один з аргументів наданий, генерується ціле число від 1 до заданого аргументу. Аргумент повинен бути цілим додатнім числом.
  • Якщо надані обидва аргументи, генерується ціле число між першим і другим аргументом. Обидва аргументи повинні бути цілими, але можуть бути й від'ємними.

Функція не працюватиме належним чином для чисел менше -2^32 і більше, ніж 2^32 - 1 (може змінюватися залежно від обладнання). Якщо вам потрібно використовувати цифри поза цим діапазоном, рекомендується використовувати en:Module:Random.

order

{{#invoke:math|order|n}}
mm._order(n)

Визначає порядок величини числа.

precision

{{#invoke:math|precision|n}}
{{#invoke:math|precision|x=n}}
mm._precision(number_string)

Визначає точність числа. Наприклад, для "4" поверне "0", для "4.567" поверне "3", і для "100" поверне "-2".

Функція намагається проаналізувати строкове подання числа, і виявляє, чи використовує число у експоненціальному записі. З цієї причини коли викликається з Lua, дуже великі або дуже точні цифри, вони повинні відразу надходити як рядки задля отримання точного результату. Якщо вони вводяться як числа, інтерпретатор Lua зміниться їх експоненціальним записом і ця функція поверне точний експоненціальний запис, а не розмір початкового числа. Це не проблема, коли число викликається з #invoke, завдяки участі #invoke все подається в рядковому форматі.

max

{{#invoke:math|max|v1|v2|v3|...}}
mm._max(v1, v2, v3, ...)

Повертає максимальне значення із вказаних значень. Значення, які не можуть бути перетворені в числа, ігноруються.

median

{{#invoke:math|median|v1|v2|v3|...}}
mm._median(v1, v2, v3, ...)

Повертає значення медіани з вказаних значень. Значення, які не можуть бути перетворені в числа, ігноруються.

min

{{#invoke:math|min|v1|v2|v3|...}}
mm._min(v1, v2, v3, ...)

Повертає мінімальне значення із вказаних значень. Значення, які не можуть бути перетворені в числа, ігноруються.

sum

{{#invoke:math|sum|v1|v2|v3|...}}
mm._sum(v1, v2, v3, ...)

Повертає суму зазначених значень. Значення, які не можуть бути перетворені в числа, ігноруються.

average

{{#invoke:math|average|v1|v2|v3|...}}
mm._average(v1, v2, v3, ...)

Повертає середнє значення із вказаних. (Точніше, це значення відповідає середньому арифметичному.) Значення, які не можуть бути перетворені в числа, ігноруються.

round

{{#invoke:math|round|value|precision}}
{{#invoke:math|round|value=value|precision=precision}}
mm._round(value, precision)

Округлює число до заданої точності як степені 10 (стандартним значення є 0, що означає до найближчого цілого числа).

Це робиться за наступною формулою:

Зверніть увагу: Станом на жовтень 2019, є баг у відображені деяких округлених чисел. Коли намагатися округлити число, що округлюється до «n.0», як «1.02», до найближчого десятка (тобто |r=1), то ця функція повинна відобразити «1.0», але неочікувано вона відображає «1». Натомість використайте параметр |precision_format=.

log10

{{#invoke:math | log10 | x}}
mm._log10(x)

Повертає log10(x), логарифм x з основою 10.

mod

{{#invoke:math|mod|x|y}}
mm._mod(x, y)

Отримує x по модулю y, або залишок після x поділеного на y. Це працює належним чином для цілих чисел до 2^53; для більших чисел оператор за модулем Lua може повертати хибне значення. Ця функція розв'язує цю проблему повертаючи 0 якщо по модулю оператору модуля Lua дається значення, яке становить менше ніж 0 або більше ніж y.

gcd

{{#invoke:math|gcd|v1|v2|...}}
mm._gcd(v1, v2, ...)

Знаходить найбільший спільний дільник із встановленого значення. Значення, які не можуть бути перетворені в числа, ігноруються.

precision_format

{{#invoke:math|precision_format|value_string|precision}}
mm._precision_format(value_string, precision)

Заокруглення числа із зазначеною точністю і форматом відповідно до правил спочатку використовувалися для {{Rnd}}. Видається рядком.

Параметр precision повинен бути цілим числом цифр після десяткової коми. Дозволяються від'ємні значення. Нецілі числа дають неочікувані результати. Додатні значення більші ніж зазначена точність додають відступи нулями, від'ємні значення більша ніж зазначений порядок можуть поглинути усі цифри.

Оформлення 8765,567 з {{[[Шаблон:#invoke:Math|#invoke:Math]]|precision_format|8765.567|точність}} дає:

точність Результат
2 8765,57
-2 8800
6 8765,567000
-6 0
2.5 8765,5680426633
-2.5 8854,3774484715

divide

{{#invoke:Math|divide|x|y|round=|precision=}}
mm._divide(x, y, round, precision)

Ділення x на y.

  • Якщо y не є числом, то повертається його значення.
  • В іншому випадку, якщо x не є числом, то повертається його значення.
  • Якщо round є true («yes» або «так» для #invoke), то результат не міститиме десяткових дробів
  • Точність вказує скільки цифр точності результат повинен мати

Якщо будь-який аргумент містить теги HTML, то вони повертаються незміненими, дозволяючи передавати будь-які помилки, які виникли під час обрахування аргументів функцією ділення, шаблону, який викликається.

cleanNumber

local number, number_string = mm._cleanNumber(number_string)

Допоміжна функція, яка може бути викликана з інших модулів Lua, але не від #invoke. Вона приймає рядкове або числове значення як вхідних даних, і, якщо значення може бути перетворено в число, cleanNumber повертає число і рядок цифр. Якщо значення не може бути перетворено в число, cleanNumber повертає nil, nil.

--[[

This module provides a number of basic mathematical operations.

]]

local yesno, getArgs -- lazily initialized

local p = {} -- Holds functions to be returned from #invoke, and functions to make available to other Lua modules.
local wrap = {} -- Holds wrapper functions that process arguments from #invoke. These act as intemediary between functions meant for #invoke and functions meant for Lua.

--[[
Helper functions used to avoid redundant code.
]]

local function err(msg)
	-- Generates wikitext error messages.
	return mw.ustring.format('<strong class="error">Помилка форматування: %s</strong>', msg)
end

local function unpackNumberArgs(args)
	-- Returns an unpacked list of arguments specified with numerical keys.
	local ret = {}
	for k, v in pairs(args) do
		if type(k) == 'number' then
			table.insert(ret, v)
		end
	end
	return unpack(ret)
end

local function makeArgArray(...)
	-- Makes an array of arguments from a list of arguments that might include nils.
	local args = {...} -- Table of arguments. It might contain nils or non-number values, so we can't use ipairs.
	local nums = {} -- Stores the numbers of valid numerical arguments.
	local ret = {}
	for k, v in pairs(args) do
		v = p._cleanNumber(v)
		if v then
			nums[#nums + 1] = k
			args[k] = v
		end
	end
	table.sort(nums)
	for i, num in ipairs(nums) do
		ret[#ret + 1] = args[num]
	end
	return ret
end

local function fold(func, ...)
	-- Use a function on all supplied arguments, and return the result. The function must accept two numbers as parameters,
	-- and must return a number as an output. This number is then supplied as input to the next function call.
	local vals = makeArgArray(...)
	local count = #vals -- The number of valid arguments
	if count == 0 then return
		-- Exit if we have no valid args, otherwise removing the first arg would cause an error.
		nil, 0
	end
	local ret = table.remove(vals, 1)
	for _, val in ipairs(vals) do
		ret = func(ret, val)
	end
	return ret, count
end

--[[
Fold arguments by selectively choosing values (func should return when to choose the current "dominant" value).
]]
local function binary_fold(func, ...)
	local value = fold((function(a, b) if func(a, b) then return a else return b end end), ...)
	return value
end

--[[
random

Generate a random number

Usage:
{{#invoke: Math | random }}
{{#invoke: Math | random | maximum value }}
{{#invoke: Math | random | minimum value | maximum value }}
]]

function wrap.random(args)
	local first = p._cleanNumber(args[1])
	local second = p._cleanNumber(args[2])
	return p._random(first, second)
end

function p._random(first, second)
	math.randomseed(mw.site.stats.edits + mw.site.stats.pages + os.time() + math.floor(os.clock() * 1000000000))
	-- math.random will throw an error if given an explicit nil parameter, so we need to use if statements to check the params.
	if first and second then
		if first <= second then -- math.random doesn't allow the first number to be greater than the second.
			return math.random(first, second)
		end
	elseif first then
		return math.random(first)
	else
		return math.random()
	end
end

--[[
order

Determine order of magnitude of a number

Usage:
    {{#invoke: Math | order | value }}
]]
function wrap.order(args)
	local input_string = (args[1] or args.x or '0');
	local input_number = p._cleanNumber(input_string);
	if input_number == nil then
		return err('вхідне значення для визначення порядку величини є нечисловим')
	else
		return p._order(input_number)
	end
end

function p._order(x)
	if x == 0 then return 0 end
	return math.floor(math.log10(math.abs(x)))
end

--[[
precision

Detemines the precision of a number using the string representation

Usage:
    {{ #invoke: Math | precision | value }}
]]
function wrap.precision(args)
	local input_string = (args[1] or args.x or '0');
	local trap_fraction = args.check_fraction;
	local input_number;

	if not yesno then
		yesno = require('Module:Yesno')
	end
	if yesno(trap_fraction, true) then -- Returns true for all input except nil, false, "no", "n", "0" and a few others. See [[Module:Yesno]].
		local pos = string.find(input_string, '/', 1, true);
		if pos ~= nil then
			if string.find(input_string, '/', pos + 1, true) == nil then
				local denominator = string.sub(input_string, pos+1, -1);
				local denom_value = tonumber(denominator);
				if denom_value ~= nil then
					return math.log10(denom_value);
				end
			end
		end
	end

	input_number, input_string = p._cleanNumber(input_string);
	if input_string == nil then
		return err('вхідне значення для визначення прецизійності є нечисловим')
	else
		return p._precision(input_string)
	end
end
function p._precision(x)
	if type(x) == 'number' then
		x = tostring(x)
	end
	x = string.upper(x)

	local decimal = x:find('[%.,]')
	local exponent_pos = x:find('E')
	local result = 0;

	if exponent_pos ~= nil then
		local exponent = string.sub(x, exponent_pos + 1)
		x = string.sub(x, 1, exponent_pos - 1)
		result = result - tonumber(exponent)
	end

	if decimal ~= nil then
		result = result + string.len(x) - decimal
		return result
	end

	local pos = string.len(x);
	while x:byte(pos) == string.byte('0') do
		pos = pos - 1
		result = result - 1
		if pos <= 0 then
			return 0
		end
	end

	return result
end

--[[
max

Finds the maximum argument

Usage:
    {{#invoke:Math| max | value1 | value2 | ... }}
OR
    {{#invoke:Math| max }}

When used with no arguments, it takes its input from the parent
frame.  Note, any values that do not evaluate to numbers are ignored.
]]
function wrap.max(args)
	return p._max(unpackNumberArgs(args))
end

function p._max(...)
	local max_value = binary_fold((function(a, b) return a > b end), ...)
	if max_value then
		return max_value
	end
end

--[[
median

Find the median of set of numbers

Usage:
{{#invoke:Math | median | number1 | number2 | ...}}
OR
{{#invoke:Math | median }}
]]

function wrap.median(args)
	return p._median(unpackNumberArgs(args))
end

function p._median(...)
	local vals = makeArgArray(...)
	local count = #vals
	table.sort(vals)

	if count == 0 then
		return 0
	end

	if p._mod(count, 2) == 0 then
		return (vals[count/2] + vals[count/2+1])/2
	else
		return vals[math.ceil(count/2)]
	end
end

--[[
min 

Finds the minimum argument

Usage:
    {{#invoke:Math| min | value1 | value2 | ... }}
OR
    {{#invoke:Math| min }}

When used with no arguments, it takes its input from the parent
frame.  Note, any values that do not evaluate to numbers are ignored.
]]
function wrap.min(args)
	return p._min(unpackNumberArgs(args))
end

function p._min(...)
	local min_value = binary_fold((function(a, b) return a < b end), ...)
	if min_value then
		return min_value
	end
end

--[[
sum

Finds the sum

Usage:
{{#invoke:Math| sum | value1 | value2 | ... }}
OR
{{#invoke:Math| sum }}

Note, any values that do not evaluate to numbers are ignored.
]]

function wrap.sum(args)
	return p._sum(unpackNumberArgs(args))
end

function p._sum(...)
	local sums, count = fold((function(a, b) return a + b end), ...)
	if not sums then
		return 0
	else
		return sums
	end
end

--[[
average 

Рахує середнє арифметичне.

Використання:
    {{#invoke:Math| average | value1 | value2 | ... }}
або
    {{#invoke:Math| average }}

Коли використовується без аргументів, бере ввід з батьківського
фрейму. Зауважте, що будь-які значення, що не є числами, ігноруються.
]]
function wrap.average(args)
	return p._average(unpackNumberArgs(args))
end

function p._average(...)
	local sum, count = fold((function(a, b) return a + b end), ...)
	if not sum then
		return 0
	else
		return sum / count
	end
end

--[[
round

Rounds a number to specified precision

Usage:
    {{#invoke:Math | round | value | precision }}
    
--]]
function wrap.round(args)
	local value = p._cleanNumber(args[1] or args.value or 0)
	local precision = p._cleanNumber(args[2] or args.precision or 0)
	if value == nil or precision == nil then
		return err('вхідні значення для округлення є нечисловим')
	else
		return p._round(value, precision)
	end
end

function p._round(value, precision)
	local rescale = math.pow(10, precision or 0);
	return math.floor(value * rescale + 0.5) / rescale;
end

--[[
log10

returns the log (base 10) of a number

Usage:
{{#invoke:Math | log10 | x }}
]]

function wrap.log10(args)
	return math.log10(args[1])
end

--[[
mod

Implements the modulo operator

Usage:
{{#invoke:Math | mod | x | y }}

--]]

function wrap.mod(args)
	local x = p._cleanNumber(args[1])
	local y = p._cleanNumber(args[2])
	if not x then
		return err('перший аргумент для операції mod є нечисловим')
	elseif not y then
		return err('другигий аргумент для операції mod є нечисловим')
	else
		return p._mod(x, y)
	end
end

function p._mod(x, y)
	local ret = x % y
	if not (0 <= ret and ret < y) then
		ret = 0
	end
	return ret
end

--[[
gcd

Calculates the greatest common divisor of multiple numbers

Usage:
{{#invoke:Math | gcd | value 1 | value 2 | value 3 | ... }}
--]]

function wrap.gcd(args)
	return p._gcd(unpackNumberArgs(args))
end

function p._gcd(...)
	local function findGcd(a, b)
		local r = b
		local oldr = a
		while r ~= 0 do
			local quotient = math.floor(oldr / r)
			oldr, r = r, oldr - quotient * r
		end
		if oldr < 0 then
			oldr = oldr * -1
		end
		return oldr
	end
	local result, count = fold(findGcd, ...)
	return result
end

--[[
precision_format

Rounds a number to the specified precision and formats according to rules 
originally used for {{template:Rnd}}.  Output is a string.

Usage:
{{#invoke: Math | precision_format | number | precision }}
]]

function wrap.precision_format(args)
	local value_string = args[1] or 0
	local precision = args[2] or 0
	return p._precision_format(value_string, precision)
end

function p._precision_format(value_string, precision)
	-- For access to Mediawiki built-in formatter.
	local lang = mw.getContentLanguage();

	local value
	value, value_string = p._cleanNumber(value_string)
	precision = p._cleanNumber(precision)

	-- Check for non-numeric input
	if value == nil or precision == nil then
		return err('недійсне вхідне значення при округленні')
	end

	local current_precision = p._precision(value)
	local order = p._order(value)

	-- Due to round-off effects it is neccesary to limit the returned precision under
	-- some circumstances because the terminal digits will be inaccurately reported.
	if order + precision >= 14 then
		if order + p._precision(value_string) >= 14 then
			precision = 13 - order;
		end
	end

	-- If rounding off, truncate extra digits
	if precision < current_precision then
		value = p._round(value, precision)
		current_precision = p._precision(value)
	end

	local formatted_num = lang:formatNum(math.abs(value))
	local sign

	-- Use proper unary minus sign rather than ASCII default
	if value < 0 then
		sign = '−'
	else
		sign = ''
	end

	-- Handle cases requiring scientific notation
	if string.find(formatted_num, 'E', 1, true) ~= nil or math.abs(order) >= 9 then
		value = value * math.pow(10, -order)
		current_precision = current_precision + order
		precision = precision + order
		formatted_num = lang:formatNum(math.abs(value))
	else
		order = 0;
	end
	formatted_num = sign .. formatted_num

	-- Pad with zeros, if needed
	if current_precision < precision then
		local padding
		if current_precision <= 0 then
			if precision > 0 then
				local zero_sep = lang:formatNum(1.1)
				formatted_num = formatted_num .. zero_sep:sub(2,2)

				padding = precision
				if padding > 20 then
					padding = 20
				end

				formatted_num = formatted_num .. string.rep('0', padding)
			end
		else
			padding = precision - current_precision
			if padding > 20 then
				padding = 20
			end
			formatted_num = formatted_num .. string.rep('0', padding)
		end
	end

	-- Add exponential notation, if necessary.
	if order ~= 0 then
		-- Use proper unary minus sign rather than ASCII default
		if order < 0 then
			order = '−' .. lang:formatNum(math.abs(order))
		else
			order = lang:formatNum(order)
		end

		formatted_num = formatted_num .. '<span style="margin:0 .15em 0 .25em">×</span>10<sup>' .. order .. '</sup>'
	end

	return formatted_num
end

--[[
divide

Implements the division operator

Usage:
{{#invoke:Math | divide | x | y | round= | precision= }}

--]]
function wrap.divide(args)
	local x = args[1]
	local y = args[2]
	local round = args.round
	local precision =  args.precision
	if not yesno then
		yesno = require('Module:Yesno')
	end
	return p._divide(x, y, yesno(round), precision)
end

function p._divide(x, y, round, precision)
	if y == nil or y == "" then
		return err("Пустий дільник")
	elseif not tonumber(y) then
		if type(y) == 'string' and string.sub(y, 1, 1) == '<' then
			return y
		else
			return err("Не є числом: " .. y)
		end
	elseif x == nil or x == "" then
		return err("Пусте ділене")
	elseif not tonumber(x) then
		if type(x) == 'string' and string.sub(x, 1, 1) == '<' then
			return x
		else
			return err("Не є числом: " .. x)
		end
	else
		local z = x / y
		if round then
			return p._round(z, 0)
		elseif precision then
			return p._round(z, precision)
		else
			return z	
		end
	end
end

--[[
Helper function that interprets the input numerically.  If the
input does not appear to be a number, attempts evaluating it as
a parser functions expression.
]]

function p._cleanNumber(number_string)
	if type(number_string) == 'number' then
		-- We were passed a number, so we don't need to do any processing.
		return number_string, tostring(number_string)
	elseif type(number_string) ~= 'string' or not number_string:find('%S') then
		-- We were passed a non-string or a blank string, so exit.
		return nil, nil;
	end

	-- Attempt basic conversion
	local number = tonumber(number_string)

	-- If failed, attempt to evaluate input as an expression
	if number == nil then
		local success, result = pcall(mw.ext.ParserFunctions.expr, number_string)
		if success then
			number = tonumber(result)
			number_string = tostring(number)
		else
			number = nil
			number_string = nil
		end
	else
		number_string = number_string:match("^%s*(.-)%s*$") -- String is valid but may contain padding, clean it.
		number_string = number_string:match("^%+(.*)$") or number_string -- Trim any leading + signs.
		if number_string:find('^%-?0[xX]') then
			-- Number is using 0xnnn notation to indicate base 16; use the number that Lua detected instead.
			number_string = tostring(number)
		end
	end

	return number, number_string
end

local function roman(i)
    local w, t, val, let = {}, {
        {1000, "M"},
        {900, "CM"},
        {500, "D"},
        {400, "CD"},
        {100, "C"},
        {90, "XC"},
        {50, "L"},
        {40, "XL"},
        {10, "X"},
        {9, "IX"},
        {5, "V"},
        {4, "IV"},
        {1, "I"}
    }
    for n, v in ipairs(t) do
        val, let = unpack(v)
        w[n]=string.rep(let,i/val)
        i=i % val
    end
    return table.concat(w)
end
 
function p.Roman(frame) -- Преобразует числа от 1 до 4999999 в римские
	local function try_tonumber(a)
    	return math.floor(tonumber(a) or error('\''.. a ..'\' не є числом.'));
	end
	local str =  frame.args[1] or '';
	if str == '' then -- пустой параметр
		return str;
	end
	local r, N = pcall(try_tonumber, str); -- попытка преобразовать в число
	if r then
	    if N<1 or N>=5e6 then 
			return frame.args[2] or 'N/A' 
		end
	    local R=N%5000
	    N=(N-R)/1000
	    return (N>0 and table.concat{'<span style="text-decoration:overline;">',roman(N),'</span>'} or '')..roman(R)
	else
		return '<strong class="error">' .. N .. '</strong>'; -- вывод ошибки
	end
end

--[[
  Выводит числа прописью на русском
]]
function p.Russian(frame)
	local str = frame.args[1] or '';
	if str == '' then
		return '';
	end
	local number = tonumber( str, 10 )

	local lang = mw.getLanguage( 'ru' )
	
	local zero = 'ноль'
	local ones = { 'один', 'два', 'три', 'четыре', 'пять', 'шесть',
		'семь', 'восемь', 'девять', 'десять', 'одиннадцать', 'двенадцать',
		'тринадцать', 'четырнадцать', 'пятнадцать', 'шестнадцать', 'семнадцать',
		'восемнадцать', 'девятнадцать' }
	local tens = { '', 'двадцать', 'тридцать', 'сорок', 'пятьдесят',
		'шестьдесят', 'семьдесят', 'восемьдесят', 'девяносто' }
	local hundreds = { 'сто', 'двести', 'триста', 'четыреста', 'пятьсот',
		'шестьсот', 'семьсот', 'восемьсот', 'девятьсот' }

	local unitsPlural = {
		{ '', '', '' },
		{ 'тысяча', 'тысячи', 'тысяч' },
		{ 'миллион', 'миллиона', 'миллионов' },
		{ 'миллиард', 'миллиарда', 'миллиардов' },
		{ 'триллион', 'триллиона', 'триллионов' },
	}

	local out = ''
	local outMinus = ''
	
	if ( number < 0 ) then
		outMinus = 'минус '
		number = math.abs( number )
	end
	
	local tripletPos = 0
	while ( number > 0 ) do
		local triplet = number % 1000
		number = math.floor( number / 1000 )

		tripletPos = tripletPos + 1
		if ( tripletPos > 5 ) then
			return ''
		end

		local tripletStr = ''
		local tripletUnit = ''
		if ( triplet > 0 ) then
			local unitPlural = unitsPlural[ tripletPos ]
			tripletUnit = lang:plural( triplet, unitPlural[1], unitPlural[2], unitPlural[3] )
		end

		if ( triplet >= 100 ) then
			tripletStr = hundreds[ math.floor( triplet / 100 ) ]
			triplet = triplet % 100
		end

		if ( triplet >= 20 ) then
			tripletStr = tripletStr .. ' ' .. tens[ math.floor( triplet / 10 ) ]
			triplet = triplet % 10
		end

		if ( triplet >= 1 ) then
			tripletStr = tripletStr .. ' ' .. ones[ triplet ]
		end
		
		-- две тысячи
		if ( tripletPos == 2 ) then
			tripletStr = mw.ustring.gsub( tripletStr, 'один$', 'одна' )
			tripletStr = mw.ustring.gsub( tripletStr, 'два$', 'две' )
		end
		
		out = tripletStr .. ' ' .. tripletUnit .. ' ' .. out
	end

	if ( out == '' ) then
		out = zero
	end

	out = outMinus .. out
	out = mw.ustring.gsub( out, ' +', ' ' )
	out = mw.text.trim ( out )
	return out
end


--[[
Wrapper function that does basic argument processing. This ensures that all functions from #invoke can use either the current
frame or the parent frame, and it also trims whitespace for all arguments and removes blank arguments.
]]

local mt = { __index = function(t, k)
	return function(frame)
		if not getArgs then
			getArgs = require('Module:Arguments').getArgs
		end
		return wrap[k](getArgs(frame))  -- Argument processing is left to Module:Arguments. Whitespace is trimmed and blank arguments are removed.
	end
end }

return setmetatable(p, mt)
Prefix: a b c d e f g h i j k l m n o p q r s t u v w x y z 0 1 2 3 4 5 6 7 8 9

Portal di Ensiklopedia Dunia

Kembali kehalaman sebelumnya