将单位从一个系统转换为另一个系统的有效方法

时间:2013-06-20 16:46:52

标签: javascript algorithm

我很难找到将不同类型的单位转换为各种其他类型的有效方法。

切换案例可行,但IMO不是一种有效的方式,我将拥有3种不同的系统(SI,Imperial和US)。

我的转换器(在我的应用内部)将始终从SI转换为某种东西或从某种东西转换为SI。它降低了复杂性,但我仍然需要有关如何制作干净代码的建议。

我已经定义了我的转换输入参数是Value(数字)和Unit(字符串) 我有2个功能。 SIToSomething(值,单位)和SOmethingToSi(值,单位)。

单位被定义,因为我将转换长度,重量,数量等。

你会建议什么?

3 个答案:

答案 0 :(得分:3)

这个怎么样:

var converters = {
    'SIToImperial' : {
        'cm' : function(val) {
            // implementation, return something
        },
        'kg' : function(val) {
            // implementation, return something
        } //, etc.
    },
    'SIToUS' : {
        'cm' : function(val) {
            // implementation, return something
        },
        'kg' : function(val) {
            // implementation, return something
        } //, etc.
    },
    'USToSI' : {
        'cm' : function(val) { /* ... */ } // etc
    } // , etc
}

SIToSomething(value, unit, system) {
    return converters["SITo" + system][unit](value);
}

var meterInImperial = SIToSomething(100, 'cm', 'Imperial');
var fiftyKilosInUS = SIToSomething(50, 'kg', 'US');

答案 1 :(得分:2)

您可以做的是拥有一个基本单元,并为每个目标单元定义与此基本单元之间的转换功能。然后,要从A转换为B,例如,您将拥有:

A -> base -> B

这样,每个单元只需要两个转换功能(不计算基本单位):

var units = {
    a: {
        toBase: function(value) { return value * 2; },
        fromBase: function(value) { return value / 2; }
    },
    b: {
        toBase: function(value) { return 1.734 * value + 48; },
        fromBase: function(value) { return (value / 1.734) - 48; }
    }
}

function convertFromTo(unitA, unitB, value) {
    return unitB.fromBase(unitA.toBase(value));
}

convertFromTo(units.a, units.b, 36489);

答案 2 :(得分:0)

对SI进行所有转换。例如,如果转换为Imperial-> US,您将使用Imperial-> SI-> US。

这是您可以投入的最小努力。它还可以“免费”获得SI。