Unit of Measure Conversion (Javascript)
Usage Examples
var km = 1;
var mi = km * Number.units["mi/km"];
var m = Number.converter.convert(mi, "mi", "m");
var ft = Number.converter.convert(m, "ft/m");
m = Number.converter.convert(ft, "ft", "m");
ft = m / Number.converter.convert("m/ft");
km = ft * Number.units["km/ft"];
nm = Number.converter.convert(km, "km", "nm");
alert("${km} km = ${nm} nm".substitute({ km: km, nm: nm }));
Implementation
// assumes b=0 in y=mx+b
core = {};
core.mixin = function (dst, src) { if (src) for (var i in src) dst[i] = src[i]; return dst; }
function UnitConverter(meter) {
var feetPerMeter = 3.2808399, feetPerMile = 5280;
this.meter = core.mixin({ km: 1000, mi: feetPerMile / feetPerMeter, ft: 1 / feetPerMeter, m: 1 }, meter);
var t = [], i = 0;
for (t[i++] in this.meter);
this.table = [];
for (i = 0; i < t.length; i++)
for (j = 0; j < t.length; j++) {
var key1 = t[i], key2 = t[(i + j + 1) % t.length];
this.table[key1 + "/" + key2] = this.meter[key2] / this.meter[key1];
}
};
Extras
with (UnitConverter) {
prototype = new Object();
prototype.convert = function () {
switch (arguments.length) {
case 1: return this.table[arguments[0]];
case 2: return arguments[0] * this.table[arguments[1]];
case 3: return arguments[0] * this.meter[arguments[1]] / this.meter[arguments[2]];
}
return Number.NaN;
}
}
Number.converter = new UnitConverter({ nm: 1852 }); // extent to include nautical miles
Number.units = Number.converter.table;
String.prototype.substitute = function (values) {
var result = this;
for (var v in values) result = result.replace("${" + v + "}", values[v]);
return result;
}
Summary
UnitConverter builds a lookup table containing the following data:
km/mi: 1.6093439975537968
km/ft: 0.000304799999536704
km/m: 0.001
km/nm: 1.852
km/km: 1
mi/ft: 0.00018939393939393942
mi/m: 0.0006213711931818182
mi/nm: 1.1507794497727275
mi/km: 0.6213711931818182
mi/mi: 1
ft/m: 3.2808399
ft/nm: 6076.1154948
ft/km: 3280.8399
ft/mi: 5279.999999999999
ft/ft: 1
m/nm: 1852
m/km: 1000
m/mi: 1609.343997553797
m/ft: 0.304799999536704
m/m: 1
nm/km: 0.5399568034557235
nm/mi: 0.8689762405798039
nm/ft: 0.0001645788334431447
nm/m: 0.0005399568034557236
nm/nm: 1
Comments (1)
Corey Alix said
at 11:36 am on Dec 27, 2010
(function () {
var feetPerMeter = 3.2808399, feetPerMile = 5280, pixelsPerInch = 96;
var units = { m: 1, km: 0.001, mi: feetPerMeter / feetPerMile, ft: feetPerMeter, "in": 12 * feetPerMeter, px: pixelsPerInch * 12 * feetPerMeter };
Math.convert = function (v1, uom1, uom2) { return v1 * units[uom2] / units[uom1]; }
})();
You don't have permission to comment on this page.