UnitsNet - 什么是运行时单位转换的最佳方式

时间:2017-01-20 01:55:51

标签: c# .net units-of-measurement

我们正在编写数据转换应用程序。

我们需要将1000个方程式中的10个提取到模板中,即“模型”。

模型将采用给定方程组的最常用度量单位。

然后必须调整每个等式的值,以确保其值对应于模型上的度量单位。

因此,我希望使用UnitsNet将给定源变量及其单位的变量值转换为目标单位。

我遇到的问题是我们在编译时不知道源单元是什么,也不知道目标单元。

我们所拥有的是在运行时出现的等式中的源和目标单位字符串缩写(其中一些将是自定义单位)。

简单示例:

目标单位:mA(Miliamperes) 源方程:Is = 8A(安培)

我们需要能够从缩写中识别度量单位,将其与目标单位进行比较,然后相应地调整值:

e.g。在上述情况下,我们将8安培乘以1000,等于8000 Miliamperes。

我无法通过UnitsNet看到一种简洁的方法。

这样的原始内容就是我到目前为止(这是用xUnit编写的单元测试):

[Theory]
[InlineData("A", "mA", "8")]
public void DoConversion(string sourceUnit, string targetUnit, string variableValue)
{
    double result = 0;
    ElectricCurrent sourceCurrent;
    if (ElectricCurrent.TryParse($"{variableValue}{sourceUnit}", out sourceCurrent))
    {
        ElectricCurrent targetCurrent;
        if (ElectricCurrent.TryParse($"1{targetUnit}", out targetCurrent))
        {
            var electricCurrentUnit = GetElectricCurrentUnitFromAbbreviation(targetUnit);
            if (electricCurrentUnit == ElectricCurrentUnit.Ampere)
            {
                result = sourceCurrent.Amperes;
            }
            if (electricCurrentUnit == ElectricCurrentUnit.Milliampere)
            {
                result = sourceCurrent.Milliamperes;
            }
        }
    }
    result.Should().Be(8000);

    // TODO: Add every other combination of all possible Units and their Scales- OMG!!!

}

private ElectricCurrentUnit GetElectricCurrentUnitFromAbbreviation(string abbreviation)
{
    // Is there a better way to determine WHICH ElectricCurrentUnit the target is?
    if (abbreviation == "A")
        return ElectricCurrentUnit.Ampere;
    if (abbreviation == "mA")
        return ElectricCurrentUnit.Milliampere;

    return ElectricCurrentUnit.Undefined;
}

但是我们必须满足的可能单位列表很大,所以我不想这样写。

似乎必须有更好的方法。

非常感谢您对此的专业见解。

1 个答案:

答案 0 :(得分:0)

这是在github上回答的:https://github.com/angularsen/UnitsNet/issues/220

提议的解决方案

这为您提供了一些工具,可以使用数量和单位的字符串表示更轻松地使用动态转换。

  • 新课程UnitConverter
  • 有关数量的新属性UnitsLengthUnit[] Units { get; }上的Length
  • 为新命名惯例重命名(已废弃)UnitClass枚举至QuantityType

这允许以下场景:

// Get quantities for populating quantity UI selector
QuantityType[] quantityTypes = Enum.GetValues(typeof(QuantityType)).Cast<QuantityType>().ToArray();

// If Length is selected, get length units for populating from/to UI selectors
LengthUnit[] lengthUnits = Length.Units;

// Perform conversion by using .ToString() on selected units
double centimeters = UnitConverter.ConvertByName(5, "Length", "Meter", "Centimeter");
double centimeters2 = UnitConverter.ConvertByAbbreviation(5, "Length", "m", "cm");