我正在为我的程序添加一个功能,用户可以随时更改其测量单位,并让程序重新计算其输入和输出。
如果用户输入了一个项目的20磅,然后决定他想以千克为单位工作,他可以随时选择一个选项来执行此操作,程序将重新计算他的20磅输入为9Kg。然后,如果他决定他宁愿以盎司工作,它会将9Kg转换为320盎司,依此类推。
最有效和最有效的方法是什么?我一直绞尽脑汁想要找到一种方法来实施正确的公式。
答案 0 :(得分:14)
以标准单位(或您喜欢使用的单位)进行所有计算。
只有用户界面需要关心单位转换。其余的代码不需要担心它。
答案 1 :(得分:4)
将值存储在内部的已知测量单位(例如,以kg为单位存储所有内容),并将公式转换为已知单位或从已知单位转换为所有其他单位。
基本上您只需要转换单位进行显示,所有内部计算都可以在一个单元中完成。
作为一个曲线球,F#内置了一个强大的UoM机制,如果你想要一些前沿的东西来玩......
答案 2 :(得分:0)
在我参与过的程序中,我们在“Units”命名空间下有单独的类,例如Units.Torque或Units.Length。
如果您创建一个类Units.Weight并将所有转换因子作为const值并将可能的单位作为枚举,则可以调用该类并转换为所需的单位。这是我们使用的系统的一个非常基本的例子:
namespace Units
{
class Weight
{
public enum WeightType
{
kg,
lb
}
const double kgTolbs = 2.20462262;
public static double Convert(double value, WeightType fromUnits, WeightType toUnits)
{
//Code here to convert units
}
}
}
通过这种结构,您可以随意转换为任何单位类型。
答案 3 :(得分:0)
我们刚刚正式发布了针对C#(也适用于Java和JavaScript)的轻量级测量和数据类型转换库UnitOf,它可以满足您的要求,而无需知道任何转换因子。您可以声明一个无状态的UnitOf.Mass变量,该变量允许您转换为任何单位,或仅作为衬板执行转换:
//As a stateless variable
UnitOf.Mass unit = new UnitOf.Mass() .FromPounds(20);
double kilograms = unit.ToKilograms(); //9.07184
double ounces = unit.ToOuncesUS(); //319.99973897268154
//As one liners
double kilogram = new UnitOf.Mass().FromPounds(20).ToKilograms(); //9.07184
double ounces = new UnitOf.Mass().FromPounds(20).ToOuncesUS(); //319.99973897268154
质量只是UnitOf提供的20种测量中的一种,它也是免费和开源的。