Module:Convert: Difference between revisions

(fix bug seen in {{val|1|u=AU/s}} and {{convert|1|AU/s|disp=unit or text}} due to unnecessary processing of the default output for an automatic per unit)
(update from sandbox per Template talk:Convert#Module version 11)
Line 947:
end
 
local function digit_grouperdigit_groups(methodparms, gapstext, method)
-- Return a numbered table to holdof groups of digits which can(left-to-right, bein joinedlocal withlanguage).
-- suitable separators (such as commas).
-- Each group is separately translated to the local language because
-- gap separators include digits which should not be translated.
-- Parameter method is a number or nil:
-- 3 for 3-digit grouping (default), or
-- 2 for 3-then-2 grouping (only for digits before decimal mark).
local len_right
-- Parameter gaps is true to use <span> gaps (numsep ignored).
local len_left = text:find('.', 1, true)
return {
if len_left then
n = 0,
len_right = #text - len_left
add = function (self, digits)
self.nlen_left = self.nlen_left +- 1
else
self[self.n] = from_en(digits)
len_left = #text
end,
end
join = function (self, rhs)
local twos = method == 2 and len_left > 5
-- Concatenate in reverse order.
local groups = collection()
if gaps then
local resultrun = ''len_left
local n
for i = 1, self.n - 1 do
if run < 4 or (run == 4 and parms.opt_comma5) then
result = '<span style="margin-left: 0.25em">' .. self[i] .. '</span>' .. result
if parms.opt_gaps then
n = run
else
n = #text
end
elseif twos then
n = run % 2 == 0 and 1 or 2
else
n = run % 3 == 0 and 3 or run % 3
end
while run > 0 do
groups:add(n)
run = run - n
n = (twos and run > 3) and 2 or 3
end
if len_right then
if groups.n == 0 then
groups:add(0)
end
if parms.opt_gaps and len_right > 3 then
local want4 = not parms.opt_gaps3 -- true gives no gap before trailing single digit
local isfirst = true
run = len_right
while run > 0 do
n = (want4 and run == 4) and 4 or (run > 3 and 3 or run)
if isfirst then
isfirst = false
groups[groups.n] = groups[groups.n] + 1 + n
else
groups:add(n)
end
run = run - n
return '<span style="white-space: nowrap">' .. self[self.n] .. result .. from_en(rhs) .. '</span>'
else
local result = self[1]
for i = 2, self.n do
result = self[i] .. numsep .. result
end
return result .. from_en(rhs)
end
end,else
groups[groups.n] = groups[groups.n] + 1 + len_right
step = 3,
end
next_position = function (self, previous)
end
-- Return position of digit just before next group.
local pos = 1
-- Digits are grouped from right-to-left (least significant first).
for i, length in ipairs(groups) do
local result = previous - self.step
groups[i] = from_en(text:sub(pos, pos + length - 1))
if method == 2 then
pos = pos + length
self.step = 2
end
return groups
return (result < 0) and 0 or result
end,
}
end
 
function with_separator(parms, text) -- for forward declaration above
-- Input text is a number in en digits andwith optional '.' decimal mark.
-- Return an equivalent of text, formatted for display:
-- with a custom decimal mark instead of '.', if wanted
-- with thousand separators inserted, if wanted
-- digits in local language
-- The given text is like '123' or '12345123.6789' or '112345.23e456789'.
-- (at one time e-notation could occur when processing an input value,
-- but is now handled elsewhere for scientific notation).
-- The text has no sign (caller inserts that later, if necessary).
-- SeparatorWhen isusing insertedgaps, onlythey inare theinserted integerbefore partand ofafter the significanddecimal mark.
-- (notSeparators afterare inserted only before the decimal mark, and not after 'e' or 'E').
if #text < 4 or parms.opt_nocomma or numsep == '' then
return from_en(text)
end
local groups = digit_groups(parms, text, group_method)
local last = text:match('()[.eE]') -- () returns position
if last == nilparms.opt_gaps then
if groups.n <= 1 then
last = #text
return groups[1] or ''
else
end
last = last - 1 -- index of last character before dot/e/E
local nowrap = '<span style="white-space: nowrap">'
end
local gap = '<span style="margin-left: 0.25em">'
if last < 4 or (last == 4 and parms.opt_comma5) then
local close = '</span>'
return from_en(text)
return nowrap .. groups[1] .. gap .. table.concat(groups, close .. gap, 2, groups.n) .. close .. close
end
local groups = digit_grouper(group_method, parms.opt_gaps)
local i = last
while i > 0 do
local position = groups:next_position(i)
groups:add(text:sub(position+1, i))
i = position
end
return table.concat(groups:join(text:sub(last+1), numsep)
end
 
Line 1,031 ⟶ 1,042:
local fmtpower = '%s<span style="margin:0 .15em 0 .25em">×</span>%s<sup>%s</sup>'
 
local function with_exponent(parms, show, exponent)
-- Return wikitext to display the implied value in scientific notation.
-- Input uses en digits; output uses digits in local language.
return format(fmtpower, from_enwith_separator(parms, show), from_en('10'), use_minus(from_en(tostring(exponent))))
end
 
Line 1,221 ⟶ 1,232:
exponent = exponent,
sign = sign,
show = sign .. with_exponent(parms, significand, exponent-1),
is_scientific = true,
}
Line 1,334 ⟶ 1,345:
-- or return false, t where t is an error message table.
-- Input can use en digits or digits in local language and can
-- have one referencereferences at the end. Accepting a referencereferences is intended
-- for use in infoboxes with a field for a value passed to convert.
-- Parameter another = true if the expected value is not the first.
Line 1,349 ⟶ 1,360:
-- clean = cleaned text with any separators and sign removed
-- (en digits and '.' decimal mark)
-- show = text formatted for output, possibly with ref strip markermarkers
-- (digits in local language and custom decimal mark)
-- The resulting show:
Line 1,358 ⟶ 1,369:
-- '+' (if the input text used '+'), or is '' (if no sign in input).
text = strip(text or '')
local t, reference = text:match('^(.*)(\127UNIQ%x+%-ref%-%x+%-QINU\127)$')
local pos = text:find('\127', 1, true)
if reference then -- found a single strip marker at end containing "-ref-"
if pos then
text = strip(t)
local before = text:sub(1, pos - 1)
local remainder = text:sub(pos)
local refs = {}
while #remainder > 0 do
local ref, spaces
ref, spaces, remainder = remainder:match('^(\127UNIQ[^\127]*%-ref%-%x+%-QINU\127)(%s*)(.*)')
if ref then
table.insert(refs, ref)
else
refs = {}
break
end
end
if #refs > 0 then
text = strip(before)
reference = table.concat(refs)
end
end
local clean = to_en(text, parms)
Line 1,432 ⟶ 1,460:
local significand, exponent = clean:match('^([%d.]+)[Ee]([+%-]?%d+)')
if significand then
show = with_exponent(parms, rounded(significand, significand), exponent)
scientific = true
else
Line 2,975 ⟶ 3,003:
end
info.decorated = true
if engscale then
end
local inout = unit_table.inout
if engscale then
local inoutabbr = unit_tableparms.inoutabbr
local if abbr == parms.'on' or abbr == inout then
info.show = info.show ..
if abbr == 'on' or abbr == inout then
info.show = info.show ..
'<span style="margin-left:0.2em">×<span style="margin-left:0.1em">' ..
from_en('10') ..
'</span></span><s style="display:none">^</s><sup>' ..
from_en(tostring(engscale.exponent)) .. '</sup>'
else
local number_id
local lk = parms.lk
if lk == 'on' or lk == inout then
number_id = make_link(engscale.link, engscale[1])
else
local number_id = engscale[1]
local lk = parms.lk
if lk == 'on' or lk == inout then
number_id = make_link(engscale.link, engscale[1])
else
number_id = engscale[1]
end
-- WP:NUMERAL recommends "&nbsp;" in values like "12 million".
info.show = info.show .. (parms.opt_adjectival and '-' or '&nbsp;') .. number_id
end
-- WP:NUMERAL recommends "&nbsp;" in values like "12 million".
info.show = info.show .. (parms.opt_adjectival and '-' or '&nbsp;') .. number_id
end
if prefix then
end
if info.show = prefix then.. info.show
end
info.show = prefix .. info.show
end
end
Anonymous user