Module:Convert/data
Appearance
![]() | This module is rated as ready for general use. It has reached a mature form and is thought to be relatively bug-free and ready for use wherever appropriate. It is ready to mention on help pages and other Wikipedia resources as an option for new users to learn. To reduce server load and bad output, it should be improved by sandbox testing rather than repeated trial-and-error editing. |
![]() | This module is subject to page protection. It is a highly visible module in use by a very large number of pages, or is substituted very frequently. Because vandalism or mistakes would affect many pages, and even trivial editing might cause substantial load on the servers, it is protected from editing. |
![]() | This module can only be edited by administrators because it is transcluded onto one or more cascade-protected pages. |
![]() | This Lua module is used on approximately 1,330,000 pages, or roughly 2% of all pages. To avoid major disruption and server load, any changes should be tested in the module's /sandbox or /testcases subpages, or in your own module sandbox. The tested changes can be added to this page in a single edit. Consider discussing changes on the talk page before implementing them. |
This page defines the conversion data used by Module:Convert. All documentation (from Module:Convert/doc) is at that page.
Do not manually add units to this page. First add the unit definitions in Module:Convert/documentation/conversion data. And then update this page by copying the results from Module:Convert/makeunits (those results appear at Module talk:Convert/makeunits).
Any changes should first be tested at Module:Convert/data/sandbox—see Module:Convert/sandbox/testcases.
New units can be manually added at Module:Convert/extra as a temporary measure before being incorporated into this main table.
--[[
This module contains most conversion data used by Module:Convert.
This is a separate file on the assumption that the bytecode will be cached,
and having Module:Convert "require" this should not be slow.
Three data tables follow:
SIprefixes prefixes like 'M' (mega, 10^6)
units all properties for a unit, including default output
defaultunits default output exceptions ('Mg' and 'g' have different defaults)
SIprefixes and defaultunits are maintained by editing this file.
However, the units table is generated by a script which reads the wikitext
for a wiki page that documents properties of units.
The wiki page is currently:
http://en.wikipedia.org/wiki/User:Johnuniq/Conversion_data
Check values at:
http://en.wikipedia.org/wiki/Template:Convert/list_of_units
http://en.wikipedia.org/wiki/Conversion_of_units
]]
local function clonetable(t)
-- Return a shallow copy of t.
local result = {}
for k, v in pairs(t) do
result[k] = v
end
return result
end
local function shouldbe(ucode, shouldbe)
-- Return an error message for a unit that "should be" something else.
-- enwiki Template:Convert outputs a much more elaborate message.
-- LATER: Decide if "shouldbe" is useful, and what to output if it is.
return 'ERROR: Use "' .. shouldbe .. '" (not "' .. ucode .. '") as the unit code.'
end
local SIprefixes = {
['Y'] = { exponent = 24, name = 'yotta' },
['Z'] = { exponent = 21, name = 'zetta' },
['E'] = { exponent = 18, name = 'exa' },
['P'] = { exponent = 15, name = 'peta' },
['T'] = { exponent = 12, name = 'tera' },
['G'] = { exponent = 9, name = 'giga' },
['M'] = { exponent = 6, name = 'mega' },
['k'] = { exponent = 3, name = 'kilo' },
['H'] = { exponent = 2, name = 'hecto' }, -- not an SI prefix, but allow for people typing this
['h'] = { exponent = 2, name = 'hecto' },
['da']= { exponent = 1, name = 'deca' },
['D'] = { exponent = 1, name = 'deca' }, -- not an SI prefix, but allow for people typing this
['d'] = { exponent = -1, name = 'deci' },
['c'] = { exponent = -2, name = 'centi' },
['m'] = { exponent = -3, name = 'milli' },
['µ'] = { exponent = -6, name = 'micro' },
['u'] = { exponent = -6, name = 'micro' }, -- not an SI prefix, but allow for people typing this
['n'] = { exponent = -9, name = 'nano' },
['p'] = { exponent =-12, name = 'pico' },
['f'] = { exponent =-15, name = 'femto' },
['a'] = { exponent =-18, name = 'atto' },
['z'] = { exponent =-21, name = 'zepto' },
['y'] = { exponent =-24, name = 'yocto' },
}
local usesubstitute = {
-- If unit has an SI prefix, these fields may have "%s" where prefix belongs.
'name1',
'name1_us',
'name2',
'name2_us',
'link',
}
local function set_prefixes(unit, prefixname)
-- Insert given prefix name into the fields which require it
-- (and which should contain '%s' to be replaced with the prefix).
-- Pity we have to do all this work when most results are not needed,
-- but it's cleaner to do it here rather than in final processing.
if unit.prefixes then
for _, name in ipairs(usesubstitute) do
local value = unit[name]
unit[name] = value:gsub('%%s', prefixname, 1)
end
end
end
-- Do not change the data in this table because it is created by running
-- a script that reads the wikitext from a wiki page (see note above).
local units = {
lookup = function (self, unit)
-- Return true, t where t is the unit's converter table (or false, message).
-- Given 'unit' is a symbol (like 'g'), with an optional SI prefix (as in 'kg').
-- If, for example, 'kg' is in this table, that entry is used; otherwise prefix is applied.
local t = self[unit]
if t ~= nil then
if t.shouldbe then
return false, shouldbe(t.shouldbe, unit)
end
local result = clonetable(t)
set_prefixes(result, '')
result.baseunit = unit
result.prefix = ''
return true, result
end
for plen = 2, 1, -1 do
-- Check for longer prefix first ('dam' is decametre).
local prefix = string.sub(unit, 1, plen)
local si = SIprefixes[prefix]
if si then
local baseunit = unit:sub(plen+1)
local t = self[baseunit]
if t and t.prefixes then
local result = clonetable(t)
set_prefixes(result, si.name)
result.symbol = prefix .. result.symbol
result.sym_us = prefix .. result.sym_us
result.baseunit = baseunit
result.prefix = prefix
result.scale = t.scale * 10 ^ (si.exponent * t.prefixes)
return true, result
end
end
end
local msg = 'Unit %s is not known.[[Category:Convert unknown unit]]'
return false, msg:format(unit)
end,
["m2"] = {
name1 = "square %smetre",
name1_us = "square %smeter",
name2 = "square %smetres",
name2_us = "square %smeters",
symbol = "m<sup>2</sup>",
sym_us = "m<sup>2</sup>",
utype = "area",
scale = 1,
offset = 0,
prefixes = 2,
default = "sqyd",
link = "Square %smetre",
},
["a"] = {
name1 = "%sare",
name1_us = "%sare",
name2 = "%sares",
name2_us = "%sares",
symbol = "a",
sym_us = "a",
utype = "area",
scale = 100,
offset = 0,
prefixes = 1,
default = "acre",
link = "Hectare#Are",
},
["ha"] = {
name1 = "hectare",
name1_us = "hectare",
name2 = "hectares",
name2_us = "hectares",
symbol = "ha",
sym_us = "ha",
utype = "area",
scale = 10000,
offset = 0,
default = "acre",
link = "Hectare",
},
["sqft"] = {
name1 = "square foot",
name1_us = "square foot",
name2 = "square feet",
name2_us = "square feet",
symbol = "sq ft",
sym_us = "sq ft",
utype = "area",
scale = 0.09290304,
offset = 0,
default = "m2",
link = "Square foot",
},
["ft2"] = {
name1 = "square foot",
name1_us = "square foot",
name2 = "square feet",
name2_us = "square feet",
symbol = "sq ft",
sym_us = "sq ft",
utype = "area",
scale = 0.09290304,
offset = 0,
default = "m2",
link = "Square foot",
},
["sqfoot"] = {
name1 = "square foot",
name1_us = "square foot",
name2 = "square foot",
name2_us = "square foot",
symbol = "sq ft",
sym_us = "sq ft",
utype = "area",
scale = 0.09290304,
offset = 0,
default = "m2",
link = "Square foot",
},
["foot2"] = {
name1 = "square foot",
name1_us = "square foot",
name2 = "square foot",
name2_us = "square foot",
symbol = "sq ft",
sym_us = "sq ft",
utype = "area",
scale = 0.09290304,
offset = 0,
default = "m2",
link = "Square foot",
},
["sqyd"] = {
name1 = "square yard",
name1_us = "square yard",
name2 = "square yards",
name2_us = "square yards",
symbol = "sq yd",
sym_us = "sq yd",
utype = "area",
scale = 0.83612736,
offset = 0,
default = "m2",
link = "Square yard",
},
["sqin"] = {
name1 = "square inch",
name1_us = "square inch",
name2 = "square inches",
name2_us = "square inches",
symbol = "sq in",
sym_us = "sq in",
utype = "area",
scale = 0.00064516,
offset = 0,
default = "cm2",
link = "Square inch",
},
["acre"] = {
name1 = "acre",
name1_us = "acre",
name2 = "acres",
name2_us = "acres",
symbol = "acre",
sym_us = "acre",
utype = "area",
scale = 4046.8564224,
offset = 0,
default = "ha",
link = "Acre",
},
["m"] = {
name1 = "%smetre",
name1_us = "%smeter",
name2 = "%smetres",
name2_us = "%smeters",
symbol = "m",
sym_us = "m",
utype = "length",
scale = 1,
offset = 0,
prefixes = 1,
default = "ft",
link = "%smetre",
},
["mi"] = {
name1 = "mile",
name1_us = "mile",
name2 = "miles",
name2_us = "miles",
symbol = "mi",
sym_us = "mi",
utype = "length",
scale = 1609.344,
offset = 0,
default = "km",
link = "Mile",
},
["ft"] = {
name1 = "foot",
name1_us = "foot",
name2 = "feet",
name2_us = "feet",
symbol = "ft",
sym_us = "ft",
utype = "length",
scale = 0.3048,
offset = 0,
default = "m",
link = "Foot (unit)",
},
["foot"] = {
name1 = "foot",
name1_us = "foot",
name2 = "foot",
name2_us = "foot",
symbol = "ft",
sym_us = "ft",
utype = "length",
scale = 0.3048,
offset = 0,
default = "m",
link = "Foot (unit)",
},
["feet"] = {
shouldbe = "ft",
},
["yd"] = {
name1 = "yard",
name1_us = "yard",
name2 = "yards",
name2_us = "yards",
symbol = "yd",
sym_us = "yd",
utype = "length",
scale = 0.3048 * 3,
offset = 0,
default = "m",
link = "Yard",
},
["in"] = {
name1 = "inch",
name1_us = "inch",
name2 = "inches",
name2_us = "inches",
symbol = "in",
sym_us = "in",
utype = "length",
scale = 0.0254,
offset = 0,
default = "cm",
link = "Inch",
},
["g"] = {
name1 = "%sgram",
name1_us = "%sgram",
name2 = "%sgrams",
name2_us = "%sgrams",
symbol = "g",
sym_us = "g",
utype = "mass",
scale = 0.001,
offset = 0,
prefixes = 1,
default = "oz",
link = "%sgram",
},
["lb"] = {
name1 = "pound",
name1_us = "pound",
name2 = "pounds",
name2_us = "pounds",
symbol = "lb",
sym_us = "lb",
utype = "mass",
scale = 0.45359237,
offset = 0,
default = "kg",
link = "Pound (mass)",
},
["oz"] = {
name1 = "ounce",
name1_us = "ounce",
name2 = "ounces",
name2_us = "ounces",
symbol = "oz",
sym_us = "oz",
utype = "mass",
scale = 0.45359237/16,
offset = 0,
default = "g",
link = "Ounce",
},
["ozt"] = {
name1 = "troy ounce",
name1_us = "troy ounce",
name2 = "troy ounces",
name2_us = "troy ounces",
symbol = "ozt",
sym_us = "ozt",
utype = "mass",
scale = 0.0311034768,
offset = 0,
default = "g",
link = "Troy ounce",
},
["K"] = {
name1 = "kelvin",
name1_us = "kelvin",
name2 = "kelvins",
name2_us = "kelvins",
symbol = "K",
sym_us = "K",
utype = "temperature",
scale = 1,
offset = 0,
default = "C",
link = "Kelvin",
},
["C"] = {
name1 = "degree Celsius",
name1_us = "degree Celsius",
name2 = "degrees Celsius",
name2_us = "degrees Celsius",
symbol = "°C",
sym_us = "°C",
utype = "temperature",
scale = 1,
offset = -273.15,
default = "F",
link = "Celsius",
},
["°C"] = {
name1 = "degree Celsius",
name1_us = "degree Celsius",
name2 = "degrees Celsius",
name2_us = "degrees Celsius",
symbol = "°C",
sym_us = "°C",
utype = "temperature",
scale = 1,
offset = -273.15,
default = "F",
link = "Celsius",
},
["F"] = {
name1 = "degree Fahrenheit",
name1_us = "degree Fahrenheit",
name2 = "degrees Fahrenheit",
name2_us = "degrees Fahrenheit",
symbol = "°F",
sym_us = "°F",
utype = "temperature",
scale = 5/9,
offset = 32-273.15*(9/5),
default = "C",
link = "Fahrenheit",
},
["°F"] = {
name1 = "degree Fahrenheit",
name1_us = "degree Fahrenheit",
name2 = "degrees Fahrenheit",
name2_us = "degrees Fahrenheit",
symbol = "°F",
sym_us = "°F",
utype = "temperature",
scale = 5/9,
offset = 32-273.15*(9/5),
default = "C",
link = "Fahrenheit",
},
["m3"] = {
name1 = "cubic %smetre",
name1_us = "cubic %smeter",
name2 = "cubic %smetres",
name2_us = "cubic %smeters",
symbol = "m<sup>3</sup>",
sym_us = "m<sup>3</sup>",
utype = "volume",
scale = 1,
offset = 0,
prefixes = 3,
default = "cuyd",
link = "Cubic %smetre",
},
["l"] = {
name1 = "%slitre",
name1_us = "%sliter",
name2 = "%slitres",
name2_us = "%sliters",
symbol = "l",
sym_us = "l",
utype = "volume",
scale = 0.001,
offset = 0,
prefixes = 1,
default = "imppt",
link = "Litre",
},
["L"] = {
name1 = "%slitre",
name1_us = "%sliter",
name2 = "%slitres",
name2_us = "%sliters",
symbol = "L",
sym_us = "L",
utype = "volume",
scale = 0.001,
offset = 0,
prefixes = 1,
default = "imppt",
link = "Litre",
},
["cuyd"] = {
name1 = "cubic yard",
name1_us = "cubic yard",
name2 = "cubic yards",
name2_us = "cubic yards",
symbol = "cu yd",
sym_us = "cu yd",
utype = "volume",
scale = 0.764554857984,
offset = 0,
default = "m3",
link = "Cubic yard",
},
["USgal"] = {
name1 = "US gallon",
name1_us = "U.S. gallon",
name2 = "US gallons",
name2_us = "U.S. gallons",
symbol = "US gal",
sym_us = "U.S. gal",
utype = "volume",
scale = 0.003785411784,
offset = 0,
default = "L",
link = "US gallon",
},
["USoz"] = {
name1 = "US fluid ounce",
name1_us = "U.S. fluid ounce",
name2 = "US fluid ounces",
name2_us = "U.S. fluid ounces",
symbol = "US fl oz",
sym_us = "U.S. fl oz",
utype = "volume",
scale = 0.003785411784/128,
offset = 0,
default = "cL",
link = "US fluid ounce",
},
["USpt"] = {
name1 = "U.S. pint",
name1_us = "U.S. pint",
name2 = "U.S. pints",
name2_us = "U.S. pints",
symbol = "US pt",
sym_us = "US pt",
utype = "volume",
scale = 0.003785411784/8,
offset = 0,
default = "dL",
},
["impgal"] = {
name1 = "imperial gallon",
name1_us = "imperial gallon",
name2 = "imperial gallons",
name2_us = "imperial gallons",
symbol = "imp gal",
sym_us = "imp gal",
utype = "volume",
scale = 0.00454609,
offset = 0,
default = "L",
link = "Imperial gallon",
},
["impoz"] = {
name1 = "imperial fluid ounce",
name1_us = "imperial fluid ounce",
name2 = "imperial fluid ounces",
name2_us = "imperial fluid ounces",
symbol = "imp fl oz",
sym_us = "imp fl oz",
utype = "volume",
scale = 0.00454609/160,
offset = 0,
default = "cL",
link = "Imperial fluid ounce",
},
["imppt"] = {
name1 = "imperial pint",
name1_us = "imperial pint",
name2 = "imperial pints",
name2_us = "imperial pints",
symbol = "imp pt",
sym_us = "imp pt",
utype = "volume",
scale = 0.00454609/8,
offset = 0,
default = "dL",
link = "Imperial pint",
},
}
local defaultunits = {
lookup = function (self, unit_table)
-- Return true, s where s = name of unit's default output unit (or false, message).
local baseunit = unit_table.baseunit
local prefix = unit_table.prefix
local unit = prefix .. baseunit
local default = self[unit]
if default ~= nil then return true, default end
local t = units[baseunit]
if t ~= nil then
local default = t.default
if default ~= nil then return true, default end
end
local msg = 'Unit %s has no default target conversion.[[Category:Convert unknown unit]]'
return false, msg:format(unit)
end,
-- Prefixed units with a default different from that of the base unit.
['kg'] = 'lb',
['Mg'] = 'lb',
['Gg'] = 'lb',
['pm'] = 'in',
['nm'] = 'in',
['um'] = 'in',
['mm'] = 'in',
['cm'] = 'in',
['dm'] = 'in',
['dam'] = 'yd',
['Hm'] = 'yd',
['km'] = 'mi',
['Mm'] = 'mi',
['mL'] = 'impoz',
['cL'] = 'impoz',
['dL'] = 'impoz',
['daL'] = 'impgal',
['HL'] = 'impgal',
}
return {
units = units,
defaultunits = defaultunits,
}