UNPKG

jspreadsheet-ce-no-init-focus

Version:

Jspreadsheet is a lightweight, vanilla javascript plugin to create amazing web-based interactive tables and spreadsheets compatible with Excel, Google Spreadsheets and any other spreadsheet software.

1,306 lines (1,137 loc) 577 kB
/** * Jspreadsheet v4.9.3 * * Website: https://bossanova.uk/jspreadsheet/ * Description: Create amazing web based spreadsheets. * * This software is distribute under MIT License */ var formula = (function() { // Based on sutoiku work (https://github.com/sutoiku) var error = (function() { var exports = {}; exports.nil = new Error('#NULL!'); exports.div0 = new Error('#DIV/0!'); exports.value = new Error('#VALUE!'); exports.ref = new Error('#REF!'); exports.name = new Error('#NAME?'); exports.num = new Error('#NUM!'); exports.na = new Error('#N/A'); exports.error = new Error('#ERROR!'); exports.data = new Error('#GETTING_DATA'); return exports; })(); var utils = (function() { var exports = {}; exports.flattenShallow = function(array) { if (!array || !array.reduce) { return array; } return array.reduce(function(a, b) { var aIsArray = Array.isArray(a); var bIsArray = Array.isArray(b); if (aIsArray && bIsArray) { return a.concat(b); } if (aIsArray) { a.push(b); return a; } if (bIsArray) { return [ a ].concat(b); } return [ a, b ]; }); }; exports.isFlat = function(array) { if (!array) { return false; } for (var i = 0; i < array.length; ++i) { if (Array.isArray(array[i])) { return false; } } return true; }; exports.flatten = function() { var result = exports.argsToArray.apply(null, arguments); while (!exports.isFlat(result)) { result = exports.flattenShallow(result); } return result; }; exports.argsToArray = function(args) { var result = []; exports.arrayEach(args, function(value) { result.push(value); }); return result; }; exports.numbers = function() { var possibleNumbers = this.flatten.apply(null, arguments); return possibleNumbers.filter(function(el) { return typeof el === 'number'; }); }; exports.cleanFloat = function(number) { var power = 1e14; return Math.round(number * power) / power; }; exports.parseBool = function(bool) { if (typeof bool === 'boolean') { return bool; } if (bool instanceof Error) { return bool; } if (typeof bool === 'number') { return bool !== 0; } if (typeof bool === 'string') { var up = bool.toUpperCase(); if (up === 'TRUE') { return true; } if (up === 'FALSE') { return false; } } if (bool instanceof Date && !isNaN(bool)) { return true; } return error.value; }; exports.parseNumber = function(string) { if (string === undefined || string === '') { return error.value; } if (!isNaN(string)) { return parseFloat(string); } return error.value; }; exports.parseNumberArray = function(arr) { var len; if (!arr || (len = arr.length) === 0) { return error.value; } var parsed; while (len--) { parsed = exports.parseNumber(arr[len]); if (parsed === error.value) { return parsed; } arr[len] = parsed; } return arr; }; exports.parseMatrix = function(matrix) { var n; if (!matrix || (n = matrix.length) === 0) { return error.value; } var pnarr; for (var i = 0; i < matrix.length; i++) { pnarr = exports.parseNumberArray(matrix[i]); matrix[i] = pnarr; if (pnarr instanceof Error) { return pnarr; } } return matrix; }; var d1900 = new Date(Date.UTC(1900, 0, 1)); exports.parseDate = function(date) { if (!isNaN(date)) { if (date instanceof Date) { return new Date(date); } var d = parseInt(date, 10); if (d < 0) { return error.num; } if (d <= 60) { return new Date(d1900.getTime() + (d - 1) * 86400000); } return new Date(d1900.getTime() + (d - 2) * 86400000); } if (typeof date === 'string') { date = new Date(date); if (!isNaN(date)) { return date; } } return error.value; }; exports.parseDateArray = function(arr) { var len = arr.length; var parsed; while (len--) { parsed = this.parseDate(arr[len]); if (parsed === error.value) { return parsed; } arr[len] = parsed; } return arr; }; exports.anyIsError = function() { var n = arguments.length; while (n--) { if (arguments[n] instanceof Error) { return true; } } return false; }; exports.arrayValuesToNumbers = function(arr) { var n = arr.length; var el; while (n--) { el = arr[n]; if (typeof el === 'number') { continue; } if (el === true) { arr[n] = 1; continue; } if (el === false) { arr[n] = 0; continue; } if (typeof el === 'string') { var number = this.parseNumber(el); if (number instanceof Error) { arr[n] = 0; } else { arr[n] = number; } } } return arr; }; exports.rest = function(array, idx) { idx = idx || 1; if (!array || typeof array.slice !== 'function') { return array; } return array.slice(idx); }; exports.initial = function(array, idx) { idx = idx || 1; if (!array || typeof array.slice !== 'function') { return array; } return array.slice(0, array.length - idx); }; exports.arrayEach = function(array, iteratee) { var index = -1, length = array.length; while (++index < length) { if (iteratee(array[index], index, array) === false) { break; } } return array; }; exports.transpose = function(matrix) { if (!matrix) { return error.value; } return matrix[0].map(function(col, i) { return matrix.map(function(row) { return row[i]; }); }); }; return exports; })(); var met = {}; met.datetime = (function() { var exports = {}; var d1900 = new Date(1900, 0, 1); var WEEK_STARTS = [ undefined, 0, 1, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, 1, 2, 3, 4, 5, 6, 0 ]; var WEEK_TYPES = [ [], [1, 2, 3, 4, 5, 6, 7], [7, 1, 2, 3, 4, 5, 6], [6, 0, 1, 2, 3, 4, 5], [], [], [], [], [], [], [], [7, 1, 2, 3, 4, 5, 6], [6, 7, 1, 2, 3, 4, 5], [5, 6, 7, 1, 2, 3, 4], [4, 5, 6, 7, 1, 2, 3], [3, 4, 5, 6, 7, 1, 2], [2, 3, 4, 5, 6, 7, 1], [1, 2, 3, 4, 5, 6, 7] ]; var WEEKEND_TYPES = [ [], [6, 0], [0, 1], [1, 2], [2, 3], [3, 4], [4, 5], [5, 6], undefined, undefined, undefined, [0, 0], [1, 1], [2, 2], [3, 3], [4, 4], [5, 5], [6, 6] ]; exports.DATE = function(year, month, day) { year = utils.parseNumber(year); month = utils.parseNumber(month); day = utils.parseNumber(day); if (utils.anyIsError(year, month, day)) { return error.value; } if (year < 0 || month < 0 || day < 0) { return error.num; } var date = new Date(year, month - 1, day); return date; }; exports.DATEVALUE = function(date_text) { if (typeof date_text !== 'string') { return error.value; } var date = Date.parse(date_text); if (isNaN(date)) { return error.value; } if (date <= -2203891200000) { return (date - d1900) / 86400000 + 1; } return (date - d1900) / 86400000 + 2; }; exports.DAY = function(serial_number) { var date = utils.parseDate(serial_number); if (date instanceof Error) { return date; } return date.getDate(); }; exports.DAYS = function(end_date, start_date) { end_date = utils.parseDate(end_date); start_date = utils.parseDate(start_date); if (end_date instanceof Error) { return end_date; } if (start_date instanceof Error) { return start_date; } return serial(end_date) - serial(start_date); }; exports.DAYS360 = function(start_date, end_date, method) { }; exports.EDATE = function(start_date, months) { start_date = utils.parseDate(start_date); if (start_date instanceof Error) { return start_date; } if (isNaN(months)) { return error.value; } months = parseInt(months, 10); start_date.setMonth(start_date.getMonth() + months); return serial(start_date); }; exports.EOMONTH = function(start_date, months) { start_date = utils.parseDate(start_date); if (start_date instanceof Error) { return start_date; } if (isNaN(months)) { return error.value; } months = parseInt(months, 10); return serial(new Date(start_date.getFullYear(), start_date.getMonth() + months + 1, 0)); }; exports.HOUR = function(serial_number) { serial_number = utils.parseDate(serial_number); if (serial_number instanceof Error) { return serial_number; } return serial_number.getHours(); }; exports.INTERVAL = function(second) { if (typeof second !== 'number' && typeof second !== 'string') { return error.value; } else { second = parseInt(second, 10); } var year = Math.floor(second/946080000); second = second%946080000; var month = Math.floor(second/2592000); second = second%2592000; var day = Math.floor(second/86400); second = second%86400; var hour = Math.floor(second/3600); second = second%3600; var min = Math.floor(second/60); second = second%60; var sec = second; year = (year > 0) ? year + 'Y' : ''; month = (month > 0) ? month + 'M' : ''; day = (day > 0) ? day + 'D' : ''; hour = (hour > 0) ? hour + 'H' : ''; min = (min > 0) ? min + 'M' : ''; sec = (sec > 0) ? sec + 'S' : ''; return 'P' + year + month + day + 'T' + hour + min + sec; }; exports.ISOWEEKNUM = function(date) { date = utils.parseDate(date); if (date instanceof Error) { return date; } date.setHours(0, 0, 0); date.setDate(date.getDate() + 4 - (date.getDay() || 7)); var yearStart = new Date(date.getFullYear(), 0, 1); return Math.ceil((((date - yearStart) / 86400000) + 1) / 7); }; exports.MINUTE = function(serial_number) { serial_number = utils.parseDate(serial_number); if (serial_number instanceof Error) { return serial_number; } return serial_number.getMinutes(); }; exports.MONTH = function(serial_number) { serial_number = utils.parseDate(serial_number); if (serial_number instanceof Error) { return serial_number; } return serial_number.getMonth() + 1; }; exports.NETWORKDAYS = function(start_date, end_date, holidays) { }; exports.NETWORKDAYS.INTL = function(start_date, end_date, weekend, holidays) { }; exports.NOW = function() { return new Date(); }; exports.SECOND = function(serial_number) { serial_number = utils.parseDate(serial_number); if (serial_number instanceof Error) { return serial_number; } return serial_number.getSeconds(); }; exports.TIME = function(hour, minute, second) { hour = utils.parseNumber(hour); minute = utils.parseNumber(minute); second = utils.parseNumber(second); if (utils.anyIsError(hour, minute, second)) { return error.value; } if (hour < 0 || minute < 0 || second < 0) { return error.num; } return (3600 * hour + 60 * minute + second) / 86400; }; exports.TIMEVALUE = function(time_text) { time_text = utils.parseDate(time_text); if (time_text instanceof Error) { return time_text; } return (3600 * time_text.getHours() + 60 * time_text.getMinutes() + time_text.getSeconds()) / 86400; }; exports.TODAY = function() { return new Date(); }; exports.WEEKDAY = function(serial_number, return_type) { serial_number = utils.parseDate(serial_number); if (serial_number instanceof Error) { return serial_number; } if (return_type === undefined) { return_type = 1; } var day = serial_number.getDay(); return WEEK_TYPES[return_type][day]; }; exports.WEEKNUM = function(serial_number, return_type) { }; exports.WORKDAY = function(start_date, days, holidays) { }; exports.WORKDAY.INTL = function(start_date, days, weekend, holidays) { }; exports.YEAR = function(serial_number) { serial_number = utils.parseDate(serial_number); if (serial_number instanceof Error) { return serial_number; } return serial_number.getFullYear(); }; function isLeapYear(year) { return new Date(year, 1, 29).getMonth() === 1; } exports.YEARFRAC = function(start_date, end_date, basis) { }; function serial(date) { var addOn = (date > -2203891200000)?2:1; return (date - d1900) / 86400000 + addOn; } return exports; })(); met.database = (function() { var exports = {}; function compact(array) { if (!array) { return array; } var result = []; for (var i = 0; i < array.length; ++i) { if (!array[i]) { continue; } result.push(array[i]); } return result; } exports.FINDFIELD = function(database, title) { var index = null; for (var i = 0; i < database.length; i++) { if (database[i][0] === title) { index = i; break; } } // Return error if the input field title is incorrect if (index == null) { return error.value; } return index; }; function findResultIndex(database, criterias) { var matches = {}; for (var i = 1; i < database[0].length; ++i) { matches[i] = true; } var maxCriteriaLength = criterias[0].length; for (i = 1; i < criterias.length; ++i) { if (criterias[i].length > maxCriteriaLength) { maxCriteriaLength = criterias[i].length; } } for (var k = 1; k < database.length; ++k) { for (var l = 1; l < database[k].length; ++l) { var currentCriteriaResult = false; var hasMatchingCriteria = false; for (var j = 0; j < criterias.length; ++j) { var criteria = criterias[j]; if (criteria.length < maxCriteriaLength) { continue; } var criteriaField = criteria[0]; if (database[k][0] !== criteriaField) { continue; } hasMatchingCriteria = true; for (var p = 1; p < criteria.length; ++p) { currentCriteriaResult = currentCriteriaResult || eval(database[k][l] + criteria[p]); // jshint // ignore:line } } if (hasMatchingCriteria) { matches[l] = matches[l] && currentCriteriaResult; } } } var result = []; for (var n = 0; n < database[0].length; ++n) { if (matches[n]) { result.push(n - 1); } } return result; } // Database functions exports.DAVERAGE = function(database, field, criteria) { // Return error if field is not a number and not a string if (isNaN(field) && (typeof field !== "string")) { return error.value; } var resultIndexes = findResultIndex(database, criteria); var targetFields = []; if (typeof field === "string") { var index = exports.FINDFIELD(database, field); targetFields = utils.rest(database[index]); } else { targetFields = utils.rest(database[field]); } var sum = 0; for (var i = 0; i < resultIndexes.length; i++) { sum += targetFields[resultIndexes[i]]; } return resultIndexes.length === 0 ? error.div0 : sum / resultIndexes.length; }; exports.DCOUNT = function(database, field, criteria) { }; exports.DCOUNTA = function(database, field, criteria) { }; exports.DGET = function(database, field, criteria) { // Return error if field is not a number and not a string if (isNaN(field) && (typeof field !== "string")) { return error.value; } var resultIndexes = findResultIndex(database, criteria); var targetFields = []; if (typeof field === "string") { var index = exports.FINDFIELD(database, field); targetFields = utils.rest(database[index]); } else { targetFields = utils.rest(database[field]); } // Return error if no record meets the criteria if (resultIndexes.length === 0) { return error.value; } // Returns the #NUM! error value because more than one record meets the // criteria if (resultIndexes.length > 1) { return error.num; } return targetFields[resultIndexes[0]]; }; exports.DMAX = function(database, field, criteria) { // Return error if field is not a number and not a string if (isNaN(field) && (typeof field !== "string")) { return error.value; } var resultIndexes = findResultIndex(database, criteria); var targetFields = []; if (typeof field === "string") { var index = exports.FINDFIELD(database, field); targetFields = utils.rest(database[index]); } else { targetFields = utils.rest(database[field]); } var maxValue = targetFields[resultIndexes[0]]; for (var i = 1; i < resultIndexes.length; i++) { if (maxValue < targetFields[resultIndexes[i]]) { maxValue = targetFields[resultIndexes[i]]; } } return maxValue; }; exports.DMIN = function(database, field, criteria) { // Return error if field is not a number and not a string if (isNaN(field) && (typeof field !== "string")) { return error.value; } var resultIndexes = findResultIndex(database, criteria); var targetFields = []; if (typeof field === "string") { var index = exports.FINDFIELD(database, field); targetFields = utils.rest(database[index]); } else { targetFields = utils.rest(database[field]); } var minValue = targetFields[resultIndexes[0]]; for (var i = 1; i < resultIndexes.length; i++) { if (minValue > targetFields[resultIndexes[i]]) { minValue = targetFields[resultIndexes[i]]; } } return minValue; }; exports.DPRODUCT = function(database, field, criteria) { // Return error if field is not a number and not a string if (isNaN(field) && (typeof field !== "string")) { return error.value; } var resultIndexes = findResultIndex(database, criteria); var targetFields = []; if (typeof field === "string") { var index = exports.FINDFIELD(database, field); targetFields = utils.rest(database[index]); } else { targetFields = utils.rest(database[field]); } var targetValues = []; for (var i = 0; i < resultIndexes.length; i++) { targetValues[i] = targetFields[resultIndexes[i]]; } targetValues = compact(targetValues); var result = 1; for (i = 0; i < targetValues.length; i++) { result *= targetValues[i]; } return result; }; exports.DSTDEV = function(database, field, criteria) { }; exports.DSTDEVP = function(database, field, criteria) { }; exports.DSUM = function(database, field, criteria) { }; exports.DVAR = function(database, field, criteria) { }; exports.DVARP = function(database, field, criteria) { }; exports.MATCH = function(lookupValue, lookupArray, matchType) { if (!lookupValue && !lookupArray) { return error.na; } if (arguments.length === 2) { matchType = 1; } if (!(lookupArray instanceof Array)) { return error.na; } if (matchType !== -1 && matchType !== 0 && matchType !== 1) { return error.na; } var index; var indexValue; for (var idx = 0; idx < lookupArray.length; idx++) { if (matchType === 1) { if (lookupArray[idx] === lookupValue) { return idx + 1; } else if (lookupArray[idx] < lookupValue) { if (!indexValue) { index = idx + 1; indexValue = lookupArray[idx]; } else if (lookupArray[idx] > indexValue) { index = idx + 1; indexValue = lookupArray[idx]; } } } else if (matchType === 0) { if (typeof lookupValue === 'string') { lookupValue = lookupValue.replace(/\?/g, '.'); if (lookupArray[idx].toLowerCase().match(lookupValue.toLowerCase())) { return idx + 1; } } else { if (lookupArray[idx] === lookupValue) { return idx + 1; } } } else if (matchType === -1) { if (lookupArray[idx] === lookupValue) { return idx + 1; } else if (lookupArray[idx] > lookupValue) { if (!indexValue) { index = idx + 1; indexValue = lookupArray[idx]; } else if (lookupArray[idx] < indexValue) { index = idx + 1; indexValue = lookupArray[idx]; } } } } return index ? index : error.na; }; return exports; })(); met.engineering = (function() { var exports = {}; function isValidBinaryNumber(number) { return (/^[01]{1,10}$/).test(number); } exports.BESSELI = function(x, n) { }; exports.BESSELJ = function(x, n) { }; exports.BESSELK = function(x, n) { }; exports.BESSELY = function(x, n) { }; exports.BIN2DEC = function(number) { // Return error if number is not binary or contains more than 10 // characters (10 digits) if (!isValidBinaryNumber(number)) { return error.num; } // Convert binary number to decimal var result = parseInt(number, 2); // Handle negative numbers var stringified = number.toString(); if (stringified.length === 10 && stringified.substring(0, 1) === '1') { return parseInt(stringified.substring(1), 2) - 512; } else { return result; } }; exports.BIN2HEX = function(number, places) { // Return error if number is not binary or contains more than 10 // characters (10 digits) if (!isValidBinaryNumber(number)) { return error.num; } // Ignore places and return a 10-character hexadecimal number if number // is negative var stringified = number.toString(); if (stringified.length === 10 && stringified.substring(0, 1) === '1') { return (1099511627264 + parseInt(stringified.substring(1), 2)).toString(16); } // Convert binary number to hexadecimal var result = parseInt(number, 2).toString(16); // Return hexadecimal number using the minimum number of characters // necessary if places is undefined if (places === undefined) { return result; } else { // Return error if places is nonnumeric if (isNaN(places)) { return error.value; } // Return error if places is negative if (places < 0) { return error.num; } // Truncate places in case it is not an integer places = Math.floor(places); // Pad return value with leading 0s (zeros) if necessary (using // Underscore.string) return (places >= result.length) ? REPT('0', places - result.length) + result : error.num; } }; exports.BIN2OCT = function(number, places) { // Return error if number is not binary or contains more than 10 // characters (10 digits) if (!isValidBinaryNumber(number)) { return error.num; } // Ignore places and return a 10-character octal number if number is // negative var stringified = number.toString(); if (stringified.length === 10 && stringified.substring(0, 1) === '1') { return (1073741312 + parseInt(stringified.substring(1), 2)).toString(8); } // Convert binary number to octal var result = parseInt(number, 2).toString(8); // Return octal number using the minimum number of characters necessary // if places is undefined if (places === undefined) { return result; } else { // Return error if places is nonnumeric if (isNaN(places)) { return error.value; } // Return error if places is negative if (places < 0) { return error.num; } // Truncate places in case it is not an integer places = Math.floor(places); // Pad return value with leading 0s (zeros) if necessary (using // Underscore.string) return (places >= result.length) ? REPT('0', places - result.length) + result : error.num; } }; exports.BITAND = function(number1, number2) { // Return error if either number is a non-numeric value number1 = utils.parseNumber(number1); number2 = utils.parseNumber(number2); if (utils.anyIsError(number1, number2)) { return error.value; } // Return error if either number is less than 0 if (number1 < 0 || number2 < 0) { return error.num; } // Return error if either number is a non-integer if (Math.floor(number1) !== number1 || Math.floor(number2) !== number2) { return error.num; } // Return error if either number is greater than (2^48)-1 if (number1 > 281474976710655 || number2 > 281474976710655) { return error.num; } // Return bitwise AND of two numbers return number1 & number2; }; exports.BITLSHIFT = function(number, shift) { number = utils.parseNumber(number); shift = utils.parseNumber(shift); if (utils.anyIsError(number, shift)) { return error.value; } // Return error if number is less than 0 if (number < 0) { return error.num; } // Return error if number is a non-integer if (Math.floor(number) !== number) { return error.num; } // Return error if number is greater than (2^48)-1 if (number > 281474976710655) { return error.num; } // Return error if the absolute value of shift is greater than 53 if (Math.abs(shift) > 53) { return error.num; } // Return number shifted by shift bits to the left or to the right if // shift is negative return (shift >= 0) ? number << shift : number >> -shift; }; exports.BITOR = function(number1, number2) { number1 = utils.parseNumber(number1); number2 = utils.parseNumber(number2); if (utils.anyIsError(number1, number2)) { return error.value; } // Return error if either number is less than 0 if (number1 < 0 || number2 < 0) { return error.num; } // Return error if either number is a non-integer if (Math.floor(number1) !== number1 || Math.floor(number2) !== number2) { return error.num; } // Return error if either number is greater than (2^48)-1 if (number1 > 281474976710655 || number2 > 281474976710655) { return error.num; } // Return bitwise OR of two numbers return number1 | number2; }; exports.BITRSHIFT = function(number, shift) { number = utils.parseNumber(number); shift = utils.parseNumber(shift); if (utils.anyIsError(number, shift)) { return error.value; } // Return error if number is less than 0 if (number < 0) { return error.num; } // Return error if number is a non-integer if (Math.floor(number) !== number) { return error.num; } // Return error if number is greater than (2^48)-1 if (number > 281474976710655) { return error.num; } // Return error if the absolute value of shift is greater than 53 if (Math.abs(shift) > 53) { return error.num; } // Return number shifted by shift bits to the right or to the left if // shift is negative return (shift >= 0) ? number >> shift : number << -shift; }; exports.BITXOR = function(number1, number2) { number1 = utils.parseNumber(number1); number2 = utils.parseNumber(number2); if (utils.anyIsError(number1, number2)) { return error.value; } // Return error if either number is less than 0 if (number1 < 0 || number2 < 0) { return error.num; } // Return error if either number is a non-integer if (Math.floor(number1) !== number1 || Math.floor(number2) !== number2) { return error.num; } // Return error if either number is greater than (2^48)-1 if (number1 > 281474976710655 || number2 > 281474976710655) { return error.num; } // Return bitwise XOR of two numbers return number1 ^ number2; }; exports.COMPLEX = function(real, imaginary, suffix) { real = utils.parseNumber(real); imaginary = utils.parseNumber(imaginary); if (utils.anyIsError(real, imaginary)) { return real; } // Set suffix suffix = (suffix === undefined) ? 'i' : suffix; // Return error if suffix is neither "i" nor "j" if (suffix !== 'i' && suffix !== 'j') { return error.value; } // Return complex number if (real === 0 && imaginary === 0) { return 0; } else if (real === 0) { return (imaginary === 1) ? suffix : imaginary.toString() + suffix; } else if (imaginary === 0) { return real.toString(); } else { var sign = (imaginary > 0) ? '+' : ''; return real.toString() + sign + ((imaginary === 1) ? suffix : imaginary.toString() + suffix); } }; exports.CONVERT = function(number, from_unit, to_unit) { number = utils.parseNumber(number); if (number instanceof Error) { return number; } // List of units supported by CONVERT and units defined by the // International System of Units // [Name, Symbol, Alternate symbols, Quantity, ISU, CONVERT, Conversion // ratio] var units = [ ["a.u. of action", "?", null, "action", false, false, 1.05457168181818e-34], ["a.u. of charge", "e", null, "electric_charge", false, false, 1.60217653141414e-19], ["a.u. of energy", "Eh", null, "energy", false, false, 4.35974417757576e-18], ["a.u. of length", "a?", null, "length", false, false, 5.29177210818182e-11], ["a.u. of mass", "m?", null, "mass", false, false, 9.10938261616162e-31], ["a.u. of time", "?/Eh", null, "time", false, false, 2.41888432650516e-17], ["admiralty knot", "admkn", null, "speed", false, true, 0.514773333], ["ampere", "A", null, "electric_current", true, false, 1], ["ampere per meter", "A/m", null, "magnetic_field_intensity", true, false, 1], ["ångström", "Å", ["ang"], "length", false, true, 1e-10], ["are", "ar", null, "area", false, true, 100], ["astronomical unit", "ua", null, "length", false, false, 1.49597870691667e-11], ["bar", "bar", null, "pressure", false, false, 100000], ["barn", "b", null, "area", false, false, 1e-28], ["becquerel", "Bq", null, "radioactivity", true, false, 1], ["bit", "bit", ["b"], "information", false, true, 1], ["btu", "BTU", ["btu"], "energy", false, true, 1055.05585262], ["byte", "byte", null, "information", false, true, 8], ["candela", "cd", null, "luminous_intensity", true, false, 1], ["candela per square metre", "cd/m?", null, "luminance", true, false, 1], ["coulomb", "C", null, "electric_charge", true, false, 1], ["cubic ångström", "ang3", ["ang^3"], "volume", false, true, 1e-30], ["cubic foot", "ft3", ["ft^3"], "volume", false, true, 0.028316846592], ["cubic inch", "in3", ["in^3"], "volume", false, true, 0.000016387064], ["cubic light-year", "ly3", ["ly^3"], "volume", false, true, 8.46786664623715e-47], ["cubic metre", "m?", null, "volume", true, true, 1], ["cubic mile", "mi3", ["mi^3"], "volume", false, true, 4168181825.44058], ["cubic nautical mile", "Nmi3", ["Nmi^3"], "volume", false, true, 6352182208], ["cubic Pica", "Pica3", ["Picapt3", "Pica^3", "Picapt^3"], "volume", false, true, 7.58660370370369e-8], ["cubic yard", "yd3", ["yd^3"], "volume", false, true, 0.764554857984], ["cup", "cup", null, "volume", false, true, 0.0002365882365], ["dalton", "Da", ["u"], "mass", false, false, 1.66053886282828e-27], ["day", "d", ["day"], "time", false, true, 86400], ["degree", "°", null, "angle", false, false, 0.0174532925199433], ["degrees Rankine", "Rank", null, "temperature", false, true, 0.555555555555556], ["dyne", "dyn", ["dy"], "force", false, true, 0.00001], ["electronvolt", "eV", ["ev"], "energy", false, true, 1.60217656514141], ["ell", "ell", null, "length", false, true, 1.143], ["erg", "erg", ["e"], "energy", false, true, 1e-7], ["farad", "F", null, "electric_capacitance", true, false, 1], ["fluid ounce", "oz", null, "volume", false, true, 0.0000295735295625], ["foot", "ft", null, "length", false, true, 0.3048], ["foot-pound", "flb", null, "energy", false, true, 1.3558179483314], ["gal", "Gal", null, "acceleration", false, false, 0.01], ["gallon", "gal", null, "volume", false, true, 0.003785411784], ["gauss", "G", ["ga"], "magnetic_flux_density", false, true, 1], ["grain", "grain", null, "mass", false, true, 0.0000647989], ["gram", "g", null, "mass", false, true, 0.001], ["gray", "Gy", null, "absorbed_dose", true, false, 1], ["gross registered ton", "GRT", ["regton"], "volume", false, true, 2.8316846592], ["hectare", "ha", null, "area", false, true, 10000], ["henry", "H", null, "inductance", true, false, 1], ["hertz", "Hz", null, "frequency", true, false, 1], ["horsepower", "HP", ["h"], "power", false, true, 745.69987158227], ["horsepower-hour", "HPh", ["hh", "hph"], "energy", false, true, 2684519.538], ["hour", "h", ["hr"], "time", false, true, 3600], ["imperial gallon (U.K.)", "uk_gal", null, "volume", false, true, 0.00454609], ["imperial hundredweight", "lcwt", ["uk_cwt", "hweight"], "mass", false, true, 50.802345], ["imperial quart (U.K)", "uk_qt", null, "volume", false, true, 0.0011365225], ["imperial ton", "brton", ["uk_ton", "LTON"], "mass", false, true, 1016.046909], ["inch", "in", null, "length", false, true, 0.0254], ["international acre", "uk_acre", null, "area", false, true, 4046.8564224], ["IT calorie", "cal", null, "energy", false, true, 4.1868], ["joule", "J", null, "energy", true, true, 1], ["katal", "kat", null, "catalytic_activity", true, false, 1], ["kelvin", "K", ["kel"], "temperature", true, true, 1], ["kilogram", "kg", null, "mass", true, true, 1], ["knot", "kn", null, "speed", false, true, 0.514444444444444], ["light-year", "ly", null, "length", false, true, 9460730472580800], ["litre", "L", ["l", "lt"], "volume", false, true, 0.001], ["lumen", "lm", null, "luminous_flux", true, false, 1], ["lux", "lx", null, "illuminance", true, false, 1], ["maxwell", "Mx", null, "magnetic_flux", false, false, 1e-18], ["measurement ton", "MTON", null, "volume", false, true, 1.13267386368], ["meter per hour", "m/h", ["m/hr"], "speed", false, true, 0.00027777777777778], ["meter per second", "m/s", ["m/sec"], "speed", true, true, 1], ["meter per second squared", "m?s??", null, "acceleration", true, false, 1], ["parsec", "pc", ["parsec"], "length", false, true, 30856775814671900], ["meter squared per second", "m?/s", null, "kinematic_viscosity", true, false, 1], ["metre", "m", null, "length", true, true, 1], ["miles per hour", "mph", null, "speed", false, true, 0.44704], ["millimetre of mercury", "mmHg", null, "pressure", false, false, 133.322], ["minute", "?", null, "angle", false, false, 0.000290888208665722], ["minute", "min", ["mn"], "time", false, true, 60], ["modern teaspoon", "tspm", null, "volume", false, true, 0.000005], ["mole", "mol", null, "amount_of_substance", true, false, 1], ["morgen", "Morgen", null, "area", false, true, 2500], ["n.u. of action", "?", null, "action", false, false, 1.05457168181818e-34], ["n.u. of mass", "m?", null, "mass", false, false, 9.10938261616162e-31], ["n.u. of speed", "c?", null, "speed", false, false, 299792458], ["n.u. of time", "?/(me?c??)", null, "time", false, false, 1.28808866778687e-21], ["nautical mile", "M", ["Nmi"], "length", false, true, 1852], ["newton", "N", null, "force", true, true, 1], ["œrsted", "Oe ", null, "magnetic_field_intensity", false, false, 79.5774715459477], ["ohm", "Ω", null, "electric_resistance", true, false, 1], ["ounce mass", "ozm", null, "mass", false, true, 0.028349523125], ["pascal", "Pa", null, "pressure", true, false, 1], ["pascal second", "Pa?s", null, "dynamic_viscosity", true, false, 1], ["pferdestärke", "PS", null, "power", false, true, 735.49875], ["phot", "ph", null, "illuminance", false, false, 0.0001], ["pica (1/6 inch)", "pica", null, "length", false, true, 0.00035277777777778], ["pica (1/72 inch)", "Pica", ["Picapt"], "length", false, true, 0.00423333333333333], ["poise", "P", null, "dynamic_viscosity", false, false, 0.1], ["pond", "pond", null, "force", false, true, 0.00980665], ["pound force", "lbf", null, "force", false, true, 4.4482216152605], ["pound mass", "lbm", null, "mass", false, true, 0.45359237], ["quart", "qt", null, "volume", false, true, 0.000946352946], ["radian", "rad", null, "angle", true, false, 1], ["second", "?", null, "angle", false, false, 0.00000484813681109536], ["second", "s", ["sec"], "time", true, true, 1], ["short hundredweight", "cwt", ["shweight"], "mass", false, true, 45.359237], ["siemens", "S", null, "electrical_conductance", true, false, 1], ["sievert", "Sv", null, "equivalent_dose", true, false, 1], ["slug", "sg", null, "mass", false, true, 14.59390294], ["square ångström", "ang2", ["ang^2"], "area", false, true, 1e-20], ["square foot", "ft2", ["ft^2"], "area", false, true, 0.09290304], ["square inch", "in2", ["in^2"], "area", false, true, 0.00064516], ["square light-year", "ly2", ["ly^2"], "area", false, true, 8.95054210748189e+31], ["square meter", "m?", null, "area", true, true, 1], ["square mile", "mi2", ["mi^2"], "area", false, true, 2589988.110336], ["square nautical mile", "Nmi2", ["Nmi^2"], "area", false, true, 3429904], ["square Pica", "Pica2", ["Picapt2", "Pica^2", "Picapt^2"], "area", false, true, 0.00001792111111111], ["square yard", "yd2", ["yd^2"], "area", false, true, 0.83612736], ["statute mile", "mi", null, "length", false, true, 1609.344], ["steradian", "sr", null, "solid_angle", true, false, 1], ["stilb", "sb", null, "luminance", false, false, 0.0001], ["stokes", "St", null, "kinematic_viscos