JSR-275 和计量单位 API 之外的 Java 计量单位库

问题描述 投票:0回答:3

除了 JSR 275(被拒绝和放弃)和 Units of Measure API(似乎没有任何生产质量的实现)之外,还有处理测量单位的 Java 库吗?

units-of-measurement jsr-275
3个回答
1
投票

我编写了一个不使用静态排版的units库(因为在我遇到的许多实际应用中,这比我希望这样的库更麻烦)。 它旨在处理基于字符串的单位以及更清晰的定义单位。 一些支持的功能包括:

  • 值的转换,例如:

    Units.convert(3, "m", "mm");
    Units.convert(3, SiBaseUnit.METER, "mm");
    

    都会返回

    3000

  • 基于字符串的单位的简化,例如:

    Units.simplify("kg^3 m^4 s^-6 A^-1");
    

    会返回

    "J^2 T"

  • 在特定上下文中查找单位的名称,例如:

    Units.inContext("lx s", UnitContextMatch.COMPATIBLE, PhysicsContext.PHOTOMETRY)
    

    将返回包含

    ("luminous exposure")
    的可导航集。

  • 支持SI单位、二进制单位、英制单位美国习惯单位原子单位普朗克单位等等。用户还可以轻松定义自己的单位。

  • 完全支持任意对数单位,例如

    LevelUnit.BEL.inReferenceTo(1, Unit.of("mV")); // automatically determines ref type -> root power
    LevelUnit.BEL.inReferenceTo(1, Unit.of("W"), LevelUnitReferenceType.POWER); // specify type explicitly
    Unit.of("ln(re 1 nA)") == LevelUnit.NEPER.inReferenceTo(1, Unit.of("nA")); // true
    
  • 支持SI前缀、二进制前缀,并允许用户轻松实现自己的前缀

  • 可以处理不相关的未知单位,例如:

    Units.convert(3, "m^2 this_is_not_a_unit", "mm^2 this_is_not_a_unit");
    

    将返回

    3e6
    ,因为未知单位
    this_is_not_a_unit
    在转换两侧相同。

  • 对于代码的性能关键部分,可以获得转换因子(如果转换是纯乘法的),例如:

    Units.factor("kg", "t");
    

    会回来

    1e-3

  • 允许检查等效性,例如

    Units.equivalent(1, "s", "min");
    

    将返回 false,因为

    1min
    1s
    不同。另一方面,检查可兑换性

    Units.convertible("s", "min");
    

    会回来

    true

  • 紧密集成在coordinates库中(从Java 16开始,该库仍然需要预览功能,但从Java 17开始,它将准备好用于生产)

常量通过

Constant
接口实现,支持例如:

  • 自己的常量定义,例如

    // (3 ± 0.2) mole
    Constant.of(3, 0.2, "mole");
    
  • 链接命令,例如

    // constant with the distance travelled by light in vacuum in (2 ± 0) seconds as value
    PhysicsConstant.SPEED_OF_LIGHT_IN_VACUUM.mul(2, 0, SiBaseUnit.SECOND);
    
    // constant of the elementary charge per (electron) mass
    PhysicsConstant.ELEMENTARY_CHARGE.div(PhysicsConstant.ELECTRON_MASS);
    
    Constant c = Constant.of(3, 0.2, "mole");
    PhysicsConstant.SHIELDING_DIFFERENCE_OF_T_AND_P_IN_HT.mul(c);
    
  • (简单)不确定性传播

  • Constant
    接口为
    jatex
    模块中的Texable接口提供默认实现,以便常量可以轻松返回正确的LaTeX代码。

  • 正确记录了 NIST 定义的大多数物理常数以及一些数学常数的实现。



0
投票

我创建了一个开源的 Unitility,用于处理物理量和测量单位,包括它们之间的轻松转换。使用示例:

// Creating temperature instance of specified units
Temperature temperature = Temperature.ofCelsius(20.5);         // {20.50 °C}

// Getting converted value for calculations
double valueInCelsius = temperature.getInCelsius();            // 20.50 °C
double valueInFahrenheits = temperature.getInFahrenheits();    // 68.90 °F

// Checking property current unit, value, and value in base unit
TemperatureUnits unit = temperature.getUnit();                // CELSIUS
TemperatureUnits baseUnit = unit.getBaseUnit();               // KELVIN 

// Changing property unit and converting back to base unit
Temperature tempInFahrenheits = temperature.toUnit(TemperatureUnits.FAHRENHEIT);
Temperature tempInKelvins = temperature.toBaseUnit(); 

此外,相同类型的数量内支持逻辑和基本数学运算:

// Logic operation example:
Temperature smallerTemp = Temperature.ofCelsius(-20.0);             
Temperature greaterTemp = Temperature.ofCelsius(0.0);   
smallerTemp.isLowerThan(greaterTemp);                              
greaterTemp.isGreaterThan(smallerTemp);  

// Math operation example:
Temperature sourceTemperature = Temperature.ofCelsius(20);
Temperature temperatureToAdd = Temperature.ofKelvins(293.15);
Temperature actualTemperature = sourceTemperature.add(temperatureToAdd); // {40°C}

如果您正在寻找简单的东西,也许这会有所帮助。它支持选择最典型的物理量及其单位(SI 和 IMPERIAL 单位)。 如果您需要添加任何特定单位或数量 - 请告诉我。

© www.soinside.com 2019 - 2024. All rights reserved.