除了 JSR 275(被拒绝和放弃)和 Units of Measure API(似乎没有任何生产质量的实现)之外,还有处理测量单位的 Java 库吗?
我编写了一个不使用静态排版的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")
的可导航集。
完全支持任意对数单位,例如
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 定义的大多数物理常数以及一些数学常数的实现。
https://github.com/unitsofmeasurement/uom-se来自 JSR 363
https://mvnrepository.com/artifact/org.unitsofmeasurement/unit-api/0.6.2-RC1
希望您的问题能够得到解决。 4年前!
我创建了一个开源的 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 单位)。 如果您需要添加任何特定单位或数量 - 请告诉我。