我正在向我的程序添加一个功能,用户可以随时更改他们的测量单位,并让程序重新计算他们的输入和输出。
如果用户输入说,20 磅的物品,然后决定他想要以公斤为单位工作,他可以随时选择一个选项来这样做,程序会将他的 20 磅输入重新计算为 9 公斤。然后,如果他决定他宁愿以盎司为单位工作,它会将 9 公斤转换为 320 盎司,以此类推。
解决此问题的最有效和最有效的方法是什么?我一直在绞尽脑汁试图找出一种方法来实施正确的公式。
我正在向我的程序添加一个功能,用户可以随时更改他们的测量单位,并让程序重新计算他们的输入和输出。
如果用户输入说,20 磅的物品,然后决定他想要以公斤为单位工作,他可以随时选择一个选项来这样做,程序会将他的 20 磅输入重新计算为 9 公斤。然后,如果他决定他宁愿以盎司为单位工作,它会将 9 公斤转换为 320 盎司,以此类推。
解决此问题的最有效和最有效的方法是什么?我一直在绞尽脑汁试图找出一种方法来实施正确的公式。
以标准单位(或您喜欢使用的单位)进行所有计算。
只有用户界面需要关心单位转换。其余代码无需担心。
将值存储在内部已知的测量单位中(例如,以千克为单位存储所有内容)并具有将已知单位转换为/从已知单位转换为所有其他单位的方程式。
基本上你只需要转换显示的单位,你所有的内部计算都可以在一个单位中完成。
作为一个曲线球,如果您想玩一些尖端的东西,F# 内置了一个强大的 UoM 机制......
在我从事的一个程序中,我们在“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
}
}
}
使用这种结构,您可以在闲暇时转换为任何单位类型。
我们刚刚正式发布了适用于 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 个测量值中的一个,它也是免费和开源的。