1(function (global) {
2 const CATEGORIES = {
3 length: { base: 'm', units: { mm: 0.001, cm: 0.01, m: 1, km: 1000, in: 0.0254, ft: 0.3048, yd: 0.9144, mi: 1609.344 } },
4 mass: { base: 'g', units: { mg: 0.001, g: 1, kg: 1000, oz: 28.349523125, lb: 453.59237, st: 6350.29318 } },
5 data: { base: 'B', units: { bit: 0.125, B: 1, KB: 1000, MB: 1e6, GB: 1e9, TB: 1e12, KiB: 1024, MiB: 1048576, GiB: 1073741824, TiB: 1099511627776 } },
6 time: { base: 's', units: { ns: 1e-9, ms: 0.001, s: 1, min: 60, h: 3600, day: 86400, week: 604800, year: 31557600 } },
7 temperature: { base: 'C', units: {
8 C: { toBase: v => v, fromBase: v => v },
9 F: { toBase: v => (v - 32) * 5 / 9, fromBase: v => v * 9 / 5 + 32 },
10 K: { toBase: v => v - 273.15, fromBase: v => v + 273.15 },
11 R: { toBase: v => (v - 491.67) * 5 / 9, fromBase: v => (v + 273.15) * 9 / 5 }
12 } }
13 };
14
15 function getUnits(category) {
16 if (!CATEGORIES[category]) throw new Error('Unknown category: ' + category);
17 return Object.keys(CATEGORIES[category].units);
18 }
19
20 function convert(value, from, to, category) {
21 const n = Number(value);
22 if (!Number.isFinite(n)) return NaN;
23 const cat = CATEGORIES[category];
24 if (!cat) throw new Error('Unknown category: ' + category);
25 if (!(from in cat.units) || !(to in cat.units)) throw new Error('Unknown unit');
26 if (category === 'temperature') {
27 return cat.units[to].fromBase(cat.units[from].toBase(n));
28 }
29 return n * cat.units[from] / cat.units[to];
30 }
31
32 function formatNumber(value, precision) {
33 if (!Number.isFinite(value)) return '';
34 const p = Number(precision);
35 return Number(value.toFixed(p)).toString();
36 }
37
38 global.UnitConverter = { CATEGORIES, getUnits, convert, formatNumber };
39 if (typeof module !== 'undefined') module.exports = global.UnitConverter;
40})(typeof window !== 'undefined' ? window : globalThis);
41
Discussion
No comments yet. Start the discussion. Recorded by @patrick-toulme.