Module:Change
| This Lua module is used on approximately 1,100 pages and changes may be widely noticed. Test changes in the module's /sandbox or /testcases subpages, or in your own module sandbox. Consider discussing changes on the talk page before implementing them. |
Implements {{change}}
-- This implements {{change}}
local p = {}
local function ntsh(outvalue)
local sortkey = '0000000000000000000'
if outvalue == nil then
return '<span style="display:none" data-sort-value="' .. sortkey .. '♠"></span>'
end
-- This code was copied from [[Template:Convert]]
if outvalue == 0 then
sortkey = '5000000000000000000'
else
local mag = math.floor(math.log10(math.abs(outvalue)) + 1e-14)
local prefix
if outvalue > 0 then
prefix = 7000 + mag
else
prefix = 2999 - mag
outvalue = outvalue + 10^(mag+1)
end
sortkey = string.format('%d', prefix) .. string.format('%015.0f', math.floor(outvalue * 10^(14-mag)))
end
return '<span style="display:none" data-sort-value="' .. sortkey .. '♠"></span>'
end
local function trim(s)
return s:match('^%s*(.-)%s*$')
end
local function isnotempty(s)
return s and trim(s) ~= ''
end
function change(args)
local rnd = require('Module:Math')._round
local prec_format = require('Module:Math')._precision_format
local lang = mw.getContentLanguage()
local function formatnum(num)
return lang:parseFormattedNumber(num) and lang:formatNum(lang:parseFormattedNumber(num)) or num
end
local errorflag = nil
local dsp = args['disp'] or 'row'
local inv = args['invert'] or 'off'
local srt = args['sort'] or ((isnotempty(args['pre']) or isnotempty(args['sort'])) and 'on' or 'off')
local n1 = (inv == 'on') and tonumber(lang:parseFormattedNumber(args['2'])) or tonumber(lang:parseFormattedNumber(args['1']))
local n2 = (inv == 'on') and tonumber(lang:parseFormattedNumber(args['1'])) or tonumber(lang:parseFormattedNumber(args['2']))
local dec = args['dec'] or '2'
local s = ((args['italics'] or 'off') == 'on' and "''" or "")
.. ((args['bold'] or 'off') == 'on' and "'''" or "")
local pc, pcr, pcrf = 'NA', 'NA'
if n1 and n2 and n1 ~= 0 then
pc = 100*(n2/n1 - 1)
pcr = rnd(pc, dec)
if pcr > 0 then
pcrf = '<span style="color:green">' ..
s .. '+' .. prec_format(pc, dec) .. '%' .. s .. '</span>'
elseif pcr < 0 then
pcrf = '<span style="color:red">' ..
s .. prec_format(pc, dec) .. '%' .. s .. '</span>'
else
pcrf = s .. prec_format(0, dec) .. '%' .. s
end
pcrf = ntsh(pcr) .. pcrf
else
pcrf = ntsh(nil) .. s .. 'NA' .. s
if n1 == nil or n2 == nil then
errorflag = 1
end
end
if dsp == 'out' then
return pcrf, errorflag
else
local pre1 = args['pre1'] or args['pre'] or ''
local pre2 = args['pre2'] or args['pre'] or ''
local suf1 = args['suf1'] or args['suf'] or ''
local suf2 = args['suf2'] or args['suf'] or ''
local rspn = 'rowspan=' .. (args['rowspan'] or '1') .. ' '
local algn = 'text-align:' .. (args['align'] or 'right') .. ';'
local bg = 'background-color:' .. (args['bgcolour'] or args['bgcolor'] or 'inherit') .. ';'
if rspn == 'rowspan=1 ' then rspn = '' end
if bg == 'background-color:inherit;' then bg = '' end
local style = rspn .. 'style="' .. algn .. bg .. '"'
local sk1, sk2 = '', ''
if srt == 'on' then
sk1 = ntsh(n1)
sk2 = ntsh(n2)
end
if n1 ~= nil then
if n1 < 0 then
n1 = '−' .. formatnum(-1*n1)
else
n1 = formatnum(n1)
end
else
n1 = (inv == 'on') and (args['2'] or '') or (args['1'] or '')
end
if n2 ~= nil then
if n2 < 0 then
n2 = '−' .. formatnum(-1*n2)
else
n2 = formatnum(n2)
end
else
n2 = (inv == 'on') and (args['1'] or '') or (args['2'] or '')
end
if dsp == 'row2' then
return style .. '|' .. s .. pre2 .. n2 .. suf2 .. s
.. '\n|' .. style .. '|' .. pcrf, errorflag
elseif inv == 'off' then
return style .. '|' .. s .. pre1 .. n1 .. suf1 .. s
.. '\n|' .. style .. '|' .. s .. pre2 .. n2 .. suf2 .. s
.. '\n|' .. style .. '|' .. pcrf, errorflag
else
return style .. '|' .. s .. pre1 .. n2 .. suf1 .. s
.. '\n|' .. style .. '|' .. s .. pre2 .. n1 .. suf2 .. s
.. '\n|' .. style .. '|' .. pcrf, errorflag
end
end
end
function p.main(frame)
local res, eflag = change((frame.args[1] or frame.args[2]) and frame.args or frame:getParent().args)
if eflag then
res = res .. frame:expandTemplate{title = 'change/error'}
end
return res
end
return p
Content Disclaimer
Informasi ini disarikan dari Wikipedia dan disajikan kembali untuk tujuan edukasi. Konten tersedia di bawah lisensi CC BY-SA 3.0. Kami tidak bertanggung jawab atas ketidakakuratan data yang bersumber dari kontribusi publik tersebut.
- The information displayed on this website is sourced in part or in whole from Wikipedia and has been adapted for the purpose of restating it. We strive to provide accurate and relevant information, however:
- There is no guarantee of absolute accuracy. Wikipedia is an open, collaborative project that can be edited by anyone, so information is subject to change.
- It is not intended to constitute professional advice. The content displayed is for informational and educational purposes only. For important decisions (e.g., medical, legal, or financial), please consult a professional.
- Content copyright. Wikipedia is licensed under the Creative Commons Attribution-ShareAlike License (CC BY-SA). This means that content may be reused with appropriate attribution and shared under a similar license.
- Responsible use. Any risk arising from the use of information from this website is entirely the responsibility of the user.