<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>https://belgen.info/wiki/index.php?action=history&amp;feed=atom&amp;title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C%3AMath</id>
	<title>Модуль:Math - История изменений</title>
	<link rel="self" type="application/atom+xml" href="https://belgen.info/wiki/index.php?action=history&amp;feed=atom&amp;title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C%3AMath"/>
	<link rel="alternate" type="text/html" href="https://belgen.info/wiki/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:Math&amp;action=history"/>
	<updated>2026-05-03T13:21:43Z</updated>
	<subtitle>История изменений этой страницы в вики</subtitle>
	<generator>MediaWiki 1.40.1</generator>
	<entry>
		<id>https://belgen.info/wiki/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:Math&amp;diff=672&amp;oldid=prev</id>
		<title>Admin: 1 версия импортирована</title>
		<link rel="alternate" type="text/html" href="https://belgen.info/wiki/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:Math&amp;diff=672&amp;oldid=prev"/>
		<updated>2022-12-20T08:44:40Z</updated>

		<summary type="html">&lt;p&gt;1 версия импортирована&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;ru&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Предыдущая версия&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Версия от 08:44, 20 декабря 2022&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-notice&quot; lang=&quot;ru&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(нет различий)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://belgen.info/wiki/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:Math&amp;diff=671&amp;oldid=prev</id>
		<title>wiki&gt;Adamant.pwn: базовая поддержка десятичных дробей, а также вариант Russian для женского рода</title>
		<link rel="alternate" type="text/html" href="https://belgen.info/wiki/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:Math&amp;diff=671&amp;oldid=prev"/>
		<updated>2020-09-07T04:04:43Z</updated>

		<summary type="html">&lt;p&gt;базовая поддержка десятичных дробей, а также вариант Russian для женского рода&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;--[[&lt;br /&gt;
&lt;br /&gt;
This module provides a number of basic mathematical operations.&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
local z = {}&lt;br /&gt;
&lt;br /&gt;
-- Generate random number&lt;br /&gt;
function z.random( frame )&lt;br /&gt;
	first = tonumber(frame.args[1]) -- if it doesn't exist it's NaN, if not a number it's nil&lt;br /&gt;
	second = tonumber(frame.args[2])&lt;br /&gt;
&lt;br /&gt;
	if first then -- if NaN or nil, will skip down to final return&lt;br /&gt;
		if first &amp;lt;= second then -- could match if both nil, but already checked that first is a number in last line&lt;br /&gt;
			return math.random(first, second)&lt;br /&gt;
		end&lt;br /&gt;
		return math.random(first)&lt;br /&gt;
	end&lt;br /&gt;
	return math.random()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
order&lt;br /&gt;
&lt;br /&gt;
Determine order of magnitude of a number&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
	{{#invoke: Math | order | value }}&lt;br /&gt;
]]&lt;br /&gt;
function z.order(frame)&lt;br /&gt;
	local input_string = (frame.args[1] or frame.args.x or '0');&lt;br /&gt;
	local input_number;&lt;br /&gt;
&lt;br /&gt;
	input_number = z._cleanNumber( frame, input_string );&lt;br /&gt;
	if input_number == nil then&lt;br /&gt;
		return '&amp;lt;strong class=&amp;quot;error&amp;quot;&amp;gt;Ошибка формата данных: нечисловое входное значение при определении десятичной степени&amp;lt;/strong&amp;gt;'&lt;br /&gt;
	else&lt;br /&gt;
		return z._order( input_number )&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
function z._order(x)&lt;br /&gt;
	if x == 0 then return 0 end&lt;br /&gt;
	return math.floor(math.log10(math.abs(x)))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
precision&lt;br /&gt;
&lt;br /&gt;
Detemines the precision of a number using the string representation&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
	{{ #invoke: Math | precision | value }}&lt;br /&gt;
]]&lt;br /&gt;
function z.precision( frame )&lt;br /&gt;
	local input_string = (frame.args[1] or frame.args.x or '0');&lt;br /&gt;
	local trap_fraction = frame.args.check_fraction or false;&lt;br /&gt;
	local input_number;&lt;br /&gt;
&lt;br /&gt;
	if type( trap_fraction ) == 'string' then&lt;br /&gt;
		trap_fraction = trap_fraction:lower();&lt;br /&gt;
		if trap_fraction == 'false' or trap_fraction == '0' or&lt;br /&gt;
				trap_fraction == 'no' or trap_fraction == '' then&lt;br /&gt;
			trap_fraction = false;&lt;br /&gt;
		else&lt;br /&gt;
			trap_fraction = true;&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if trap_fraction then&lt;br /&gt;
		local pos = string.find( input_string, '/', 1, true );&lt;br /&gt;
		if pos ~= nil then&lt;br /&gt;
			if string.find( input_string, '/', pos + 1, true ) == nil then&lt;br /&gt;
				local denominator = string.sub( input_string, pos+1, -1 );&lt;br /&gt;
				local denom_value = tonumber( denominator );&lt;br /&gt;
				if denom_value ~= nil then&lt;br /&gt;
					return math.log10(denom_value);&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	input_number, input_string = z._cleanNumber( frame, input_string );&lt;br /&gt;
	if input_string == nil then&lt;br /&gt;
		return '&amp;lt;strong class=&amp;quot;error&amp;quot;&amp;gt;Ошибка формата данных: нечисловое входное значение при определении дробной части&amp;lt;/strong&amp;gt;'&lt;br /&gt;
	else&lt;br /&gt;
		return z._precision( input_string )&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
function z._precision( x )&lt;br /&gt;
	x = string.upper( x )&lt;br /&gt;
&lt;br /&gt;
	local decimal = string.find( x, '[.,]', 1 )&lt;br /&gt;
	local exponent_pos = string.find( x, 'E', 1, true )&lt;br /&gt;
	local result = 0;&lt;br /&gt;
&lt;br /&gt;
	if exponent_pos ~= nil then&lt;br /&gt;
		local exponent = string.sub( x, exponent_pos + 1 )&lt;br /&gt;
		x = string.sub( x, 1, exponent_pos - 1 )&lt;br /&gt;
		result = result - tonumber( exponent )&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if decimal ~= nil then&lt;br /&gt;
		result = result + string.len( x ) - decimal&lt;br /&gt;
		return result&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local pos = string.len( x );&lt;br /&gt;
	while x:byte(pos) == string.byte('0') do&lt;br /&gt;
		pos = pos - 1&lt;br /&gt;
		result = result - 1&lt;br /&gt;
		if pos &amp;lt;= 0 then&lt;br /&gt;
			return 0&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return result&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
max&lt;br /&gt;
&lt;br /&gt;
Finds the maximum argument&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
	{{#invoke:Math| max | value1 | value2 | ... }}&lt;br /&gt;
OR&lt;br /&gt;
	{{#invoke:Math| max }}&lt;br /&gt;
&lt;br /&gt;
When used with no arguments, it takes its input from the parent&lt;br /&gt;
frame.  Note, any values that do not evaluate to numbers are ignored.&lt;br /&gt;
]]&lt;br /&gt;
function z.max( frame )&lt;br /&gt;
	local args = frame.args;&lt;br /&gt;
&lt;br /&gt;
	if args[1] == nil then&lt;br /&gt;
		local parent = frame:getParent();&lt;br /&gt;
		args = parent.args;&lt;br /&gt;
	end&lt;br /&gt;
	local max_value = nil;&lt;br /&gt;
&lt;br /&gt;
	local i = 1;&lt;br /&gt;
	while args[i] ~= nil do&lt;br /&gt;
		local val = z._cleanNumber( frame, args[i] );&lt;br /&gt;
		if val ~= nil then&lt;br /&gt;
			if max_value == nil or val &amp;gt; max_value then&lt;br /&gt;
				max_value = val;&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		i = i + 1;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return max_value&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
min&lt;br /&gt;
&lt;br /&gt;
Finds the minimum argument&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
	{{#invoke:Math| min | value1 | value2 | ... }}&lt;br /&gt;
OR&lt;br /&gt;
	{{#invoke:Math| min }}&lt;br /&gt;
&lt;br /&gt;
When used with no arguments, it takes its input from the parent&lt;br /&gt;
frame.  Note, any values that do not evaluate to numbers are ignored.&lt;br /&gt;
]]&lt;br /&gt;
function z.min( frame )&lt;br /&gt;
	local args = frame.args;&lt;br /&gt;
&lt;br /&gt;
	if args[1] == nil then&lt;br /&gt;
		local parent = frame:getParent();&lt;br /&gt;
		args = parent.args;&lt;br /&gt;
	end&lt;br /&gt;
	local min_value = nil;&lt;br /&gt;
&lt;br /&gt;
	local i = 1;&lt;br /&gt;
	while args[i] ~= nil do&lt;br /&gt;
		local val = z._cleanNumber( frame, args[i] );&lt;br /&gt;
		if val ~= nil then&lt;br /&gt;
			if min_value == nil or val &amp;lt; min_value then&lt;br /&gt;
				min_value = val;&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		i = i + 1;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return min_value&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
round&lt;br /&gt;
&lt;br /&gt;
Rounds a number to specified precision&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
	{{#invoke:Math | round | value | precision }}&lt;br /&gt;
&lt;br /&gt;
--]]&lt;br /&gt;
function z.round(frame)&lt;br /&gt;
	local value, precision;&lt;br /&gt;
&lt;br /&gt;
	value = z._cleanNumber( frame, frame.args[1] or frame.args.value or 0 );&lt;br /&gt;
	precision = z._cleanNumber( frame, frame.args[2] or frame.args.precision or 0 );&lt;br /&gt;
&lt;br /&gt;
	if value == nil or precision == nil then&lt;br /&gt;
		return '&amp;lt;strong class=&amp;quot;error&amp;quot;&amp;gt;Ошибка формата данных: нечисловое входное значение при округлении до целого&amp;lt;/strong&amp;gt;'&lt;br /&gt;
	else&lt;br /&gt;
		return z._round( value, precision );&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
function z._round( value, precision )&lt;br /&gt;
	local rescale = math.pow( 10, precision );&lt;br /&gt;
	return math.floor( value * rescale + 0.5 ) / rescale;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
precision_format&lt;br /&gt;
&lt;br /&gt;
Rounds a number to the specified precision and formats according to rules&lt;br /&gt;
originally used for {{template:Rnd}}.  Output is a string.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
{{#invoke: Math | precision_format | number | precision }}&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
function z.precision_format(args)&lt;br /&gt;
	local value_string = args[1] or 0&lt;br /&gt;
	local precision = args[2] or 0&lt;br /&gt;
	return z._precision_format(value_string, precision)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function z._cleanNumberNew( number_string )&lt;br /&gt;
	if type(number_string) == 'number' then&lt;br /&gt;
		-- We were passed a number, so we don't need to do any processing.&lt;br /&gt;
		return number_string, tostring(number_string)&lt;br /&gt;
	elseif type(number_string) ~= 'string' or not number_string:find('%S') then&lt;br /&gt;
		-- We were passed a non-string or a blank string, so exit.&lt;br /&gt;
		return nil, nil;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Attempt basic conversion&lt;br /&gt;
	local number = tonumber(number_string)&lt;br /&gt;
&lt;br /&gt;
	-- If failed, attempt to evaluate input as an expression&lt;br /&gt;
	if number == nil then&lt;br /&gt;
		local success, result = pcall(mw.ext.ParserFunctions.expr, number_string)&lt;br /&gt;
		if success then&lt;br /&gt;
			number = tonumber(result)&lt;br /&gt;
			number_string = tostring(number)&lt;br /&gt;
		else&lt;br /&gt;
			number = nil&lt;br /&gt;
			number_string = nil&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		number_string = number_string:match(&amp;quot;^%s*(.-)%s*$&amp;quot;) -- String is valid but may contain padding, clean it.&lt;br /&gt;
		number_string = number_string:match(&amp;quot;^%+(.*)$&amp;quot;) or number_string -- Trim any leading + signs.&lt;br /&gt;
		if number_string:find('^%-?0[xX]') then&lt;br /&gt;
			-- Number is using 0xnnn notation to indicate base 16; use the number that Lua detected instead.&lt;br /&gt;
			number_string = tostring(number)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return number, number_string&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function z._precision_format(value_string, precision)&lt;br /&gt;
	-- For access to Mediawiki built-in formatter.&lt;br /&gt;
	local lang = mw.getContentLanguage();&lt;br /&gt;
&lt;br /&gt;
	local r = &amp;quot;before: v = &amp;quot; .. tostring(value_string) .. &amp;quot;; p= &amp;quot; .. tostring(precision) .. '\n'&lt;br /&gt;
&lt;br /&gt;
	local value&lt;br /&gt;
	value, value_string = z._cleanNumberNew(value_string)&lt;br /&gt;
	precision = z._cleanNumberNew(precision)&lt;br /&gt;
&lt;br /&gt;
	-- Check for non-numeric input&lt;br /&gt;
	if value == nil or precision == nil then&lt;br /&gt;
		return '&amp;lt;strong class=&amp;quot;error&amp;quot;&amp;gt;Ошибка формата данных: нечисловое входное значение при округлении с заданной точностью&amp;lt;/strong&amp;gt;'&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local current_precision = z._precision(value)&lt;br /&gt;
	&lt;br /&gt;
	local order = z._order(value)&lt;br /&gt;
&lt;br /&gt;
	-- Due to round-off effects it is neccesary to limit the returned precision under&lt;br /&gt;
	-- some circumstances because the terminal digits will be inaccurately reported.&lt;br /&gt;
	if order + precision &amp;gt;= 14 then&lt;br /&gt;
		local orig_precision = z._precision(value_string)&lt;br /&gt;
		if order + orig_precision &amp;gt;= 14 then&lt;br /&gt;
			precision = 13 - order;&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- If rounding off, truncate extra digits&lt;br /&gt;
	if precision &amp;lt; current_precision then&lt;br /&gt;
		value = z._round(value, precision)&lt;br /&gt;
		current_precision = z._precision(value)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local formatted_num = lang:formatNum(math.abs(value))&lt;br /&gt;
	local sign&lt;br /&gt;
&lt;br /&gt;
	-- Use proper unary minus sign rather than ASCII default&lt;br /&gt;
	if value &amp;lt; 0 then&lt;br /&gt;
		sign = '−'&lt;br /&gt;
	else&lt;br /&gt;
		sign = ''&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Handle cases requiring scientific notation&lt;br /&gt;
	if string.find(formatted_num, 'E', 1, true) ~= nil or math.abs(order) &amp;gt;= 9 then&lt;br /&gt;
		value = value * math.pow(10, -order)&lt;br /&gt;
		current_precision = current_precision + order&lt;br /&gt;
		precision = precision + order&lt;br /&gt;
		formatted_num = lang:formatNum(math.abs(value))&lt;br /&gt;
	else&lt;br /&gt;
		order = 0;&lt;br /&gt;
	end&lt;br /&gt;
	formatted_num = sign .. formatted_num&lt;br /&gt;
&lt;br /&gt;
	-- Pad with zeros, if needed&lt;br /&gt;
	if current_precision &amp;lt; precision then&lt;br /&gt;
		local padding&lt;br /&gt;
		if current_precision &amp;lt;= 0 then&lt;br /&gt;
			if precision &amp;gt; 0 then&lt;br /&gt;
				local zero_sep = lang:formatNum(1.1)&lt;br /&gt;
				formatted_num = formatted_num .. zero_sep:sub(2,2)&lt;br /&gt;
&lt;br /&gt;
				padding = precision&lt;br /&gt;
				if padding &amp;gt; 20 then&lt;br /&gt;
					padding = 20&lt;br /&gt;
				end&lt;br /&gt;
&lt;br /&gt;
				formatted_num = formatted_num .. string.rep('0', padding)&lt;br /&gt;
			end&lt;br /&gt;
		else&lt;br /&gt;
			padding = precision - current_precision&lt;br /&gt;
			if padding &amp;gt; 20 then&lt;br /&gt;
				padding = 20&lt;br /&gt;
			end&lt;br /&gt;
			formatted_num = formatted_num .. string.rep('0', padding)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Add exponential notation, if necessary.&lt;br /&gt;
	if order ~= 0 then&lt;br /&gt;
		-- Use proper unary minus sign rather than ASCII default&lt;br /&gt;
		if order &amp;lt; 0 then&lt;br /&gt;
			order = '−' .. lang:formatNum(math.abs(order))&lt;br /&gt;
		else&lt;br /&gt;
			order = lang:formatNum(order)&lt;br /&gt;
		end&lt;br /&gt;
		formatted_num = formatted_num .. '&amp;lt;span style=&amp;quot;margin:0 .15em 0 .25em&amp;quot;&amp;gt;×&amp;lt;/span&amp;gt;10&amp;lt;sup&amp;gt;' .. order .. '&amp;lt;/sup&amp;gt;'&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return formatted_num&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
Helper function that interprets the input numerically.  If the&lt;br /&gt;
input does not appear to be a number, attempts evaluating it as&lt;br /&gt;
a parser functions expression.&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
function z._cleanNumber( frame, number_string )&lt;br /&gt;
	if number_string == nil or number_string:len() == 0 then&lt;br /&gt;
		return nil, nil;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Attempt basic conversion&lt;br /&gt;
	local number = tonumber( number_string )&lt;br /&gt;
&lt;br /&gt;
	-- If failed, attempt to evaluate input as an expression&lt;br /&gt;
	if number == nil then&lt;br /&gt;
		local attempt = frame:callParserFunction( '#expr', number_string );&lt;br /&gt;
		attempt = tonumber( attempt );&lt;br /&gt;
		if attempt ~= nil then&lt;br /&gt;
			number = attempt;&lt;br /&gt;
			number_string = tostring( number );&lt;br /&gt;
		else&lt;br /&gt;
			number = nil;&lt;br /&gt;
			number_string = nil;&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
	-- String is valid but may contain padding, clean it.&lt;br /&gt;
		number_string = mw.text.trim(number_string)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return number, number_string;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function roman(i)&lt;br /&gt;
	local w, t, val, let = {}, {&lt;br /&gt;
		{1000, &amp;quot;M&amp;quot;},&lt;br /&gt;
		{900, &amp;quot;CM&amp;quot;},&lt;br /&gt;
		{500, &amp;quot;D&amp;quot;},&lt;br /&gt;
		{400, &amp;quot;CD&amp;quot;},&lt;br /&gt;
		{100, &amp;quot;C&amp;quot;},&lt;br /&gt;
		{90, &amp;quot;XC&amp;quot;},&lt;br /&gt;
		{50, &amp;quot;L&amp;quot;},&lt;br /&gt;
		{40, &amp;quot;XL&amp;quot;},&lt;br /&gt;
		{10, &amp;quot;X&amp;quot;},&lt;br /&gt;
		{9, &amp;quot;IX&amp;quot;},&lt;br /&gt;
		{5, &amp;quot;V&amp;quot;},&lt;br /&gt;
		{4, &amp;quot;IV&amp;quot;},&lt;br /&gt;
		{1, &amp;quot;I&amp;quot;}&lt;br /&gt;
	}&lt;br /&gt;
	for n, v in ipairs(t) do&lt;br /&gt;
		val, let = unpack(v)&lt;br /&gt;
		w[n]=string.rep(let,i/val)&lt;br /&gt;
		i=i % val&lt;br /&gt;
	end&lt;br /&gt;
	return table.concat(w)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function z.Roman(frame) -- Преобразует числа от 1 до 4999999 в римские&lt;br /&gt;
	local function try_tonumber(a)&lt;br /&gt;
		return math.floor(tonumber(a) or error('\''.. a ..'\' не является числом.'));&lt;br /&gt;
	end&lt;br /&gt;
	local str =  frame.args[1] or '';&lt;br /&gt;
	if str == '' then -- пустой параметр&lt;br /&gt;
		return str;&lt;br /&gt;
	end&lt;br /&gt;
	local r, N = pcall(try_tonumber, str); -- попытка преобразовать в число&lt;br /&gt;
	if r then&lt;br /&gt;
		if N&amp;lt;1 or N&amp;gt;=5e6 then&lt;br /&gt;
			return frame.args[2] or 'N/A'&lt;br /&gt;
		end&lt;br /&gt;
		local R=N%5000&lt;br /&gt;
		N=(N-R)/1000&lt;br /&gt;
		return (N&amp;gt;0 and table.concat{'&amp;lt;span style=&amp;quot;text-decoration:overline;&amp;quot;&amp;gt;',roman(N),'&amp;lt;/span&amp;gt;'} or '')..roman(R)&lt;br /&gt;
	else&lt;br /&gt;
		return '&amp;lt;strong class=&amp;quot;error&amp;quot;&amp;gt;' .. N .. '&amp;lt;/strong&amp;gt;'; -- вывод ошибки&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function z.RussianFem(frame)&lt;br /&gt;
	local result = z.Russian(frame)&lt;br /&gt;
	return string.gsub(string.gsub(result, 'два$', 'две'), 'один$', 'одна')&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
  Выводит числа прописью на русском&lt;br /&gt;
]]&lt;br /&gt;
function z.Russian(frame)&lt;br /&gt;
	local str = frame.args[1] or '';&lt;br /&gt;
	if str == '' then&lt;br /&gt;
		return '';&lt;br /&gt;
	end&lt;br /&gt;
	local lang = mw.getLanguage( 'ru' )&lt;br /&gt;
	if string.find(str, '%.') or string.find(str, ',') then&lt;br /&gt;
		a, b = string.match(str, '(%d+).(%d+)')&lt;br /&gt;
		local basic = { 'десят', 'сот'}&lt;br /&gt;
		local prefixes = {'', 'десяти', 'сто'}&lt;br /&gt;
		local orders = {'тысячн', 'миллионн', 'миллиардн',&lt;br /&gt;
						'триллионн', 'квадриллионн'}&lt;br /&gt;
		local ed = {'ая', 'ые', 'ых'}&lt;br /&gt;
		a = #a and a or '0'&lt;br /&gt;
		b = #b and b or '0'&lt;br /&gt;
		local order = math.floor(#b / #prefixes)&lt;br /&gt;
		if order &amp;gt; #orders then&lt;br /&gt;
			order = #orders&lt;br /&gt;
			b = string.sub(b, 0, #prefixes * #orders)&lt;br /&gt;
		end&lt;br /&gt;
		mw.log(order)&lt;br /&gt;
		local ia = z.RussianFem({args={a}})&lt;br /&gt;
		local ib = z.RussianFem({args={b}})&lt;br /&gt;
		local intgr = 'цел'&lt;br /&gt;
		local fract = ''&lt;br /&gt;
		if order == 0 then&lt;br /&gt;
			fract = basic[#b]&lt;br /&gt;
		else&lt;br /&gt;
			fract = prefixes[#b % #prefixes + 1] .. orders[order]&lt;br /&gt;
		end&lt;br /&gt;
		intgr = lang:plural(tonumber(a, 10) % 1000, intgr .. ed[1],&lt;br /&gt;
													intgr .. ed[2],&lt;br /&gt;
													intgr .. ed[3])&lt;br /&gt;
		fract = lang:plural(tonumber(b, 10) % 1000, fract .. ed[1],&lt;br /&gt;
													fract .. ed[2],&lt;br /&gt;
													fract .. ed[3])&lt;br /&gt;
		return ia .. ' ' .. intgr .. ' и ' .. ib .. ' ' .. fract&lt;br /&gt;
	end&lt;br /&gt;
	local number = tonumber( str, 10 )&lt;br /&gt;
	&lt;br /&gt;
	local zero = 'ноль'&lt;br /&gt;
	local ones = { 'один', 'два', 'три', 'четыре', 'пять', 'шесть',&lt;br /&gt;
		'семь', 'восемь', 'девять', 'десять', 'одиннадцать', 'двенадцать',&lt;br /&gt;
		'тринадцать', 'четырнадцать', 'пятнадцать', 'шестнадцать', 'семнадцать',&lt;br /&gt;
		'восемнадцать', 'девятнадцать' }&lt;br /&gt;
	local tens = { '', 'двадцать', 'тридцать', 'сорок', 'пятьдесят',&lt;br /&gt;
		'шестьдесят', 'семьдесят', 'восемьдесят', 'девяносто' }&lt;br /&gt;
	local hundreds = { 'сто', 'двести', 'триста', 'четыреста', 'пятьсот',&lt;br /&gt;
		'шестьсот', 'семьсот', 'восемьсот', 'девятьсот' }&lt;br /&gt;
&lt;br /&gt;
	local unitsPlural = {&lt;br /&gt;
		{ '', '', '' },&lt;br /&gt;
		{ 'тысяча', 'тысячи', 'тысяч' },&lt;br /&gt;
		{ 'миллион', 'миллиона', 'миллионов' },&lt;br /&gt;
		{ 'миллиард', 'миллиарда', 'миллиардов' },&lt;br /&gt;
		{ 'триллион', 'триллиона', 'триллионов' },&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	local out = ''&lt;br /&gt;
	local outMinus = ''&lt;br /&gt;
	&lt;br /&gt;
	if ( number &amp;lt; 0 ) then&lt;br /&gt;
		outMinus = 'минус '&lt;br /&gt;
		number = math.abs( number )&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local tripletPos = 0&lt;br /&gt;
	while ( number &amp;gt; 0 ) do&lt;br /&gt;
		local triplet = number % 1000&lt;br /&gt;
		number = math.floor( number / 1000 )&lt;br /&gt;
&lt;br /&gt;
		tripletPos = tripletPos + 1&lt;br /&gt;
		if ( tripletPos &amp;gt; 5 ) then&lt;br /&gt;
			return ''&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		local tripletStr = ''&lt;br /&gt;
		local tripletUnit = ''&lt;br /&gt;
		if ( triplet &amp;gt; 0 ) then&lt;br /&gt;
			local unitPlural = unitsPlural[ tripletPos ]&lt;br /&gt;
			tripletUnit = lang:plural( triplet, unitPlural[1], unitPlural[2], unitPlural[3] )&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		if ( triplet &amp;gt;= 100 ) then&lt;br /&gt;
			tripletStr = hundreds[ math.floor( triplet / 100 ) ]&lt;br /&gt;
			triplet = triplet % 100&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		if ( triplet &amp;gt;= 20 ) then&lt;br /&gt;
			tripletStr = tripletStr .. ' ' .. tens[ math.floor( triplet / 10 ) ]&lt;br /&gt;
			triplet = triplet % 10&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		if ( triplet &amp;gt;= 1 ) then&lt;br /&gt;
			tripletStr = tripletStr .. ' ' .. ones[ triplet ]&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		-- две тысячи&lt;br /&gt;
		if ( tripletPos == 2 ) then&lt;br /&gt;
			tripletStr = mw.ustring.gsub( tripletStr, 'один$', 'одна' )&lt;br /&gt;
			tripletStr = mw.ustring.gsub( tripletStr, 'два$', 'две' )&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		out = tripletStr .. ' ' .. tripletUnit .. ' ' .. out&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if ( out == '' ) then&lt;br /&gt;
		out = zero&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	out = outMinus .. out&lt;br /&gt;
	out = mw.ustring.gsub( out, ' +', ' ' )&lt;br /&gt;
	out = mw.text.trim ( out )&lt;br /&gt;
	return out&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return z&lt;/div&gt;</summary>
		<author><name>wiki&gt;Adamant.pwn</name></author>
	</entry>
</feed>