Module:Unité : Différence entre versions
(Nouvelle page : local p = { } --- Copie de Outils.trim acceptant les nombres. local function trim( texte ) if type( texte ) == 'string' then texte = texte:gsub( '^%s*(.*)%f[%s]%s*$', '%1' )...) |
(bug avec puissance en littéral) |
||
Ligne 114 : | Ligne 114 : | ||
local i = 1 | local i = 1 | ||
local unit = trim( args[2] ) | local unit = trim( args[2] ) | ||
− | if unit == 10 then | + | local exp |
− | + | if unit == '10' then | |
+ | exp = args[3] | ||
i = 2 | i = 2 | ||
unit = trim( args[4] ) | unit = trim( args[4] ) | ||
end | end | ||
− | local exp = trim( args.e ) | + | local exp = exp or trim( args.e ) |
if exp then | if exp then | ||
if #wiki > 0 then | if #wiki > 0 then |
Version du 16 avril 2015 à 08:25
La documentation pour ce module peut être créée à Module:Unité/doc
local p = { } --- Copie de Outils.trim acceptant les nombres. local function trim( texte ) if type( texte ) == 'string' then texte = texte:gsub( '^%s*(.*)%f[%s]%s*$', '%1' ) if texte ~= '' then return texte end elseif type( texte ) == 'number' then return tostring( texte ) end end --- -- parseNum transforme si possible une chaine formater en un chaine interprétable par tonumber() -- retourne une chaine pour éviter les arrondi éventuels de lua. -- si nombre n'est pas un nombre ou une chaine retourne une chaine vide. -- function p.parseNombre( nombre ) if type( nombre ) == 'number' then nombre = tostring( nombre ) elseif type( nombre ) ~= 'string' then return '' elseif nombre == '' or not nombre:match( '^[-\226]?[\128\136]?[\146-\148]?[%d., \194\160]+$' ) then return nombre end if nombre:match( '^-?[\146-\148]?[%d., \194\160]+$' ) or nombre:match( '^\226[\128\136][\146-\148][%d., \194\160]+$' ) or nombre:match( '^−[%d., \194\160]+$' ) then -- suppression espaces et remplacement minus, ensp et emsp par un tiret (utilisé par lua) -- Utilise string pour être plus rapide. nombre = nombre:gsub( ' ', '' ):gsub( '\194\160', '' ) :gsub( '^\226\128[\146-\148]', '-' ) -- U+2012 à U+2014 (voir [[Tiret]]) :gsub( '^−', '-' ) -- U+2212 :gsub( '^&minus', '-' ) -- code html du signe moins if nombre:match( '[.,]' ) then if nombre:match( '%d+,%d%d%d,%d%d%d%f[%D]' ) -- type 1,234,567 or nombre:match( '%d+,%d%d%d%.%d+' ) -- type 1,234.5 --or nombre:match( '%d+,%d00$' ) -- type 1,200 then -- format anglo-saxon nombre = nombre:gsub( ',', '' ) elseif nombre:match( '%d+%.%d%d%d,%d' ) or nombre:match( '%d+%.%d%d%d.%d%d%d%f[%D]' ) then -- formant germanique type 1.234,5 nombre = nombre:gsub( '%.', '' ):gsub( ',', '.' ) else nombre = nombre:gsub( ',', '.' ) end end end return nombre end --- -- _formantNum transforme un nombre ou une chaine représentant un nombre en chaine formatée suivant les conventions du français -- si le paramètre ne représente pas un nombre lua il est retourné sans modification function p._formatNum( num ) if type( num ) == 'number' then num = tostring( num ) elseif type( num ) ~= 'string' then return num end local moins, entier, fraction = num:match( '^(-?)(%d+)%.?(%d*)$' ) if not entier then return num end if moins == '-' then moins = '−' -- signe moins (U+2212) end if entier:len() > 3 then local ini = math.fmod( entier:len(), 3 ) entier = ( entier:sub( 1, ini ) or '') .. entier:sub( ini + 1 ):gsub( '(%d%d%d)', '\194\160%1' ) end if fraction ~= '' then fraction = ',' .. fraction:gsub( '(%d%d%d)', '%1\194\160' ):gsub( '\194\160$', '' ) end return moins .. entier .. fraction end --- -- formatNum transforme les nombre d'une chaine function p.formatNum( num ) if type( num ) == 'number' then return p._formatNum( num ) elseif type( num ) == 'string' then return num:gsub( '-?%d*%.?%d+', p.formatNombre ) end end function p.formatNombre( nombre ) return p._formatNum( p.parseNombre( nombre ) ) end function p._unite( args ) local wiki = { } local sep = '' local nombre = trim( args[1] ) if nombre then nombre = nombre:gsub( '[-−–—]?%f[%d][%d., \194\160]+%f[%D]', p.formatNombre ) table.insert( wiki, nombre ) sep = '\194\160' end local i = 1 local unit = trim( args[2] ) local exp if unit == '10' then exp = args[3] i = 2 unit = trim( args[4] ) end local exp = exp or trim( args.e ) if exp then if #wiki > 0 then table.insert( wiki, '×10<sup>' .. exp .. '</sup>' ) else table.insert( wiki, '10<sup>' .. exp .. '</sup>' ) end sep = '\194\160' end while unit do table.insert( wiki, sep ) table.insert( wiki, unit ) exp = trim( args[ 2 * i + 1 ] ) if exp then table.insert( wiki, '<sup>' .. exp:gsub( '-', '−' ) .. '</sup>' ) end i = i + 1 unit = trim( args[ 2 * i ] ) sep = '⋅' end if #wiki > 0 then return '<span class="nowrap">' .. table.concat( wiki ) .. '</span>' end end function p.unite( frame ) local args if type( frame ) == 'table' and type( frame.getParent ) == 'function' then args = frame:getParent().args; end if args then return p._unite( args ) end end return p