gpt4 book ai didi

javascript - 计量单位转换库

转载 作者:行者123 更新时间:2023-12-02 23:04:17 40 4
gpt4 key购买 nike

根据用户首选的计量单位设置,在客户端中抽象出计量单位转换的最佳/最优雅的方法是什么?

例如,假设用户 A 的首选度量单位是“公制”,而用户 B 的首选度量单位是“英制”。

现在假设我已经计算出某个物体的面积(以平方米为单位)。当我要显示该值时,我需要为每个用户使用不同的转换系数(例如,“1 米 = 1.09361 码”)。或者说我已经计算出液体体积(以毫升为单位)。用户 B 的观看次数将使用转换“236.588237 毫升 = 1 美制杯”来计算。

这里是否有任何人都知道的现有 JavaScript 库可以处理这些琐碎的 UOM 转换?

最佳答案

这是我为了好玩而编写的一个小脚本。它处理克、字节、米和升的所有 SI 转换,并且我还添加了盎司和磅作为非 SI 单位的示例。要添加更多内容,您需要:

  1. 将基本类型添加到遵循 SI 或 SI 的项目的“单位”列表
  2. 为不遵循 SI 的商品添加转化率

用法:

$u(1, 'g').as('kg').val(); // converts one gram to kg

您可以使用 .val() 获取值,使用 .toString() 获取字符串表示形式,或通过 .debug() 获取完整详细信息

(function () {
var table = {};

window.unitConverter = function (value, unit) {
this.value = value;
if (unit) {
this.currentUnit = unit;
}
};
unitConverter.prototype.as = function (targetUnit) {
this.targetUnit = targetUnit;
return this;
};
unitConverter.prototype.is = function (currentUnit) {
this.currentUnit = currentUnit;
return this;
};

unitConverter.prototype.val = function () {
// first, convert from the current value to the base unit
var target = table[this.targetUnit];
var current = table[this.currentUnit];
if (target.base != current.base) {
throw new Error('Incompatible units; cannot convert from "' + this.currentUnit + '" to "' + this.targetUnit + '"');
}

return this.value * (current.multiplier / target.multiplier);
};
unitConverter.prototype.toString = function () {
return this.val() + ' ' + this.targetUnit;
};
unitConverter.prototype.debug = function () {
return this.value + ' ' + this.currentUnit + ' is ' + this.val() + ' ' + this.targetUnit;
};
unitConverter.addUnit = function (baseUnit, actualUnit, multiplier) {
table[actualUnit] = { base: baseUnit, actual: actualUnit, multiplier: multiplier };
};

var prefixes = ['Y', 'Z', 'E', 'P', 'T', 'G', 'M', 'k', 'h', 'da', '', 'd', 'c', 'm', 'u', 'n', 'p', 'f', 'a', 'z', 'y'];
var factors = [24, 21, 18, 15, 12, 9, 6, 3, 2, 1, 0, -1, -2, -3, -6, -9, -12, -15, -18, -21, -24];
// SI units only, that follow the mg/kg/dg/cg type of format
var units = ['g', 'b', 'l', 'm'];

for (var j = 0; j < units.length; j++) {
var base = units[j];
for (var i = 0; i < prefixes.length; i++) {
unitConverter.addUnit(base, prefixes[i] + base, Math.pow(10, factors[i]));
}
}

// we use the SI gram unit as the base; this allows
// us to convert between SI and English units
unitConverter.addUnit('g', 'ounce', 28.3495231);
unitConverter.addUnit('g', 'oz', 28.3495231);
unitConverter.addUnit('g', 'pound', 453.59237);
unitConverter.addUnit('g', 'lb', 453.59237);


window.$u = function (value, unit) {
var u = new window.unitConverter(value, unit);
return u;
};
})();

console.log($u(1, 'g').as('kg').debug());
console.log($u(1, 'kg').as('g').debug());
console.log($u(1, 'g').as('mg').debug());
console.log($u(1, 'mg').as('g').debug());
console.log($u(1, 'mg').as('kg').debug());

console.log($u(1, 'g').as('oz').debug());
console.log($u(1, 'g').as('lb').debug());

console.log($u(1, 'oz').as('lb').debug());

console.log($u(1, 'lb').as('g').debug());

// this last one throws an exception since you can't convert liters to mg
console.log($u(1, 'l').as('mg').debug());

我已将其移至 Github 上的一个小型存储库,因此如果有人想要改进/增强,他们可以这样做: https://github.com/jerodvenemafm/jsunitconverter

关于javascript - 计量单位转换库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/865590/

40 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com