Модуль:Gapnum
| Цей модуль позначений як К:реліз, готовий до загального вжитку (259). Він досягнув стадії готовності й вважається, що вільний від помилок і може використовуватись всюди, де знадобиться. Його можна згадувати на довідкових сторінках та інших сторінках Вікіпедії як можливість для навчання новачків. Аби зменшити навантаження на сервери та некоректний показ сторінок, його потрібно вдосконалювати через тестування у пісочниці[en], а не через застосування спроб і помилок. |
| Цей модуль позначено як К:такий, що потребує захищеного статусу (116). Завершені модулі використовуються в дуже великій кількості статей, або часто використовуються як підстановки. Позаяк акти вандалізму або помилки можуть вплинути на багато сторінок і навіть незначне редагування призведе до істотного навантаження на сервери, вони підлягають захисту від редагувань. |
| Цей модуль Lua використовується на близько 38 000 сторінках і його зміни будуть дуже помітними. Будь ласка, перевіряйте будь-які зміни на підсторінках /пісочниці та /тестів цього модуля, або у вашій пісочниці модуля, та зважайте на обговорення змін на сторінці обговорення перед їхнім впровадженням. |
| Цей модуль залежить від наступних модулів: |
Цей модуль використовується {{val}}.
Використання в інших модулях
gaps
Функція gaps може бути корисною для форматування чисел в інших модулях, які працюють з відображенням великих чисел.
local gaps = require('Module:Gapnum').gaps
При використанні функції gaps першим аргументом є число, яке потрібно оформити. Другим аргументом може бути таблиця з ключами, які вказують модулю як оформлювати. Ключі таблиці, які можна використати:
gap— число з одиницями CSS (px, em, en тощо), які визначають розмір проміжку між числами. Якщо пусте значення, то модуль використає0.25em.prec— число, що визначає точність десяткової частини числа. Якщо точність менша ніж кількість цифр, то додаткові цифри будуть вилучені бе округлення; а якщо їх більше, то нулі будуть додані в кінці числа, щоб створити бажану точність. Якщо пусте значення, модуль використає-1, що означає точність буде такою ж як і точність зазначеного числа; жодна цифра не буде додана чи вилучена.
Зверніть увагу, що повернуте твердження є таблицею. Це означає, що можна додати більше стилів і тексту до обгортального тегу span, але це також може означати, що, можливо, необхідно буде застосувати tostring() при використанні в інших модулях.
local gaps = require('Module:Gapnum').gaps
function example()
local n = 123456.78900011
-- Приклад простого форматування числа
-- n_gaps використовуватиме стандартне значення, проміжок у .25em та без змін в точності
-- Результат буде мати проміжки створені рядковим css
-- Але результат виглядатиме ось так:
-- 123 456.789 000 11
local n_gaps = gaps(n)
-- Інший розмір проміжків
-- Це форматує n у ті ж самі групи, що і вище
-- Але пробіли між групами будуть більшими та меншими відповідно
local n_big_gaps = gaps(n, {gap='1em'})
local n_small_gaps = gaps(n, {gap='1px'})
-- Інша точність
-- n_prec_5 використає число 123456.78900
-- Результат виглядатиме ось так:
-- 123 456.789 00
local n_prec_5 = gaps(n, {prec=5})
-- n_prec_10 використає число 123456.7890001100
-- Результат виглядатиме ось так:
-- 123 456.789 000 1100
local n_prec_10 = gaps(n, {prec=10})
-- Можна використати одночасно різні проміжки і різну точність:
local n_big_5 = gaps(n, {gap='1em', prec=5})
local n_small_10 = gaps(n, {gap='1px', prec=10})
end
groups
Функцію groups можна використати в інших модулях, щоб розділити число на групи як це робить функція gaps, але замість форматованого string, функція поверне таблицю з цими елементами, розділеними по групах.
local groups = require('Module:Gapnum').groups
function example()
-- Це поверне одну таблицю:
-- {123,456}
local n1 = groups(123456)
-- Це поверне дві таблиці, де кожна присвоєна для іншої змінної:
-- n2a буде:
-- {1,234}
-- n2b буде:
-- {567,89}
local n2a,n2b = groups(1234.56789)
-- Це поверне дві таблиці:
-- Ціла частина завжди повертається, навіть якщо вона є 0
-- n3a буде:
-- {0}
-- n3b буде:
-- {123,4567}
local n3a,n3b = groups(0.1234567)
-- Так само як і в інших функціях, точність можна визначити
-- точність є просто другим параметром
-- n4a буде:
-- {123}
-- n4b буде:
-- {456,700,00}
local n4a,n4b = groups(123.4567,8)
end
Дописувачі можуть експериментувати на підсторінках пісочниця (створити | дзеркало) та тести (створити) цього модуля.
Будь ласка, додавайте категорії до підсторінки /документація. Підсторінки цієї сторінки.
local p={}
local getArgs
function p.main(frame)
if not getArgs then
getArgs = require('Module:Arguments').getArgs
end
local args = getArgs(frame, {wrappers = 'Template:Gapnum'})
local n = args[1]
if not n then
error('Parameter 1 is required')
elseif not tonumber(n) and not tonumber(n, 36) then -- Validates any number with base ≤ 36
error('Unable to convert "' .. args[1] .. '" to a number')
end
local gap = args.gap
local precision = tonumber(args.prec)
return p.gaps(n,{gap=gap,prec=precision})
end
-- Not named p._main so that it has a better function name when required by Module:Val
function p.gaps(n,tbl)
local nstr = tostring(n)
if not tbl then
tbl = {}
end
local gap = tbl.gap or '.25em'
local int_part, frac_part = p.groups(n,tbl.prec)
local ret = mw.html.create('span')
:css('white-space','nowrap')
-- No gap necessary on first group
:wikitext(table.remove(int_part,1))
-- Build int part
for _, v in ipairs(int_part) do
ret:tag('span')
:css('margin-left',gap)
:wikitext(v)
end
if frac_part then
-- The first group after the decimal shouldn't have a gap
ret:wikitext('.' .. table.remove(frac_part,1))
-- Build frac part
for _, v in ipairs(frac_part) do
ret:tag('span')
:css('margin-left',gap)
:wikitext(v)
end
end
return ret
end
-- Creates tables where each element is a different group of the number
function p.groups(num,precision)
local nstr = tostring(num)
if not precision then
precision = -1
end
local decimalloc = nstr:find('.', 1, true)
local int_part, frac_part
if decimalloc == nil then
int_part = nstr
else
int_part = nstr:sub(1, decimalloc-1)
frac_part = nstr:sub(decimalloc + 1)
end
-- only define ret_i as an empty table, let ret_d stay nil
local ret_i,ret_d = {}
-- Loop to handle most of the groupings; from right to left, so that if a group has less than 3 members, it will be the first group
while int_part:len() > 3 do
-- Insert in first spot, since we're moving backwards
table.insert(ret_i,1,int_part:sub(-3))
int_part = int_part:sub(1,-4)
end
-- handle any left over numbers
if int_part:len() > 0 then
table.insert(ret_i,1,int_part)
end
if precision ~= 0 and frac_part then
ret_d = {}
if precision == -1 then
precision = frac_part:len()
end
-- Reduce the length of the string if required precision is less than actual precision
-- OR
-- Increase it (by adding 0s) if the required precision is more than actual
local offset = precision - frac_part:len()
if offset < 0 then
frac_part = frac_part:sub(1,precision)
elseif offset > 0 then
frac_part = frac_part .. string.rep('0', offset)
end
-- Allow groups of 3 or 2 (3 first)
for v in string.gmatch(frac_part,'%d%d%d?') do
table.insert(ret_d,v)
end
-- Preference for groups of 4 instead of groups of 1 at the end
if #frac_part % 3 == 1 then
if frac_part:len() == 1 then
ret_d = {frac_part}
else
local last_g = ret_d[#ret_d] or ''
last_g = last_g..frac_part:sub(-1)
ret_d[#ret_d] = last_g
end
end
end
return ret_i,ret_d
end
return p