4

我正在向我的程序添加一个功能,用户可以随时更改他们的测量单位,并让程序重新计算他​​们的输入和输出。

如果用户输入说,20 磅的物品,然后决定他想要以公斤为单位工作,他可以​​随时选择一个选项来这样做,程序会将他的 20 磅输入重新计算为 9 公斤。然后,如果他决定他宁愿以盎司为单位工作,它会将 9 公斤转换为 320 盎司,以此类推。

解决此问题的最有效和最有效的方法是什么?我一直在绞尽脑汁试图找出一种方法来实施正确的公式。

4

4 回答 4

15

以标准单位(或您喜欢使用的单位)进行所有计算。

  • 将用户的输入从他们想要的任何内容转换为标准单位。
  • 使用标准单位进行计算。
  • 将答案转换回用户想要的单位。

只有用户界面需要关心单位转换。其余代码无需担心。

于 2010-05-07T21:13:49.857 回答
5

将值存储在内部已知的测量单位中(例如,以千克为单位存储所有内容)并具有将已知单位转换为/从已知单位转换为所有其他单位的方程式。

基本上你只需要转换显示的单位,你所有的内部计算都可以在一个单位中完成。

作为一个曲线球,如果您想玩一些尖端的东西,F# 内置了一个强大的 UoM 机制......

于 2010-05-07T21:16:58.487 回答
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
        }
    }
}

使用这种结构,您可以在闲暇时转换为任何单位类型。

于 2010-05-07T21:23:50.883 回答
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 个测量值中的一个,它也是免费和开源的。

于 2018-07-11T03:42:48.603 回答