使用 Java 测量单位 API 的美制/英制单位

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

我只在 Java 测量单位标准的 Indriya 2.0.4 参考实现 中看到公制单位。当然其他人也想用英尺、英寸和英里来工作,但我找不到任何相关信息。谁能告诉我我在这里缺少什么?

我可以做

Quantity<Mass> weight = Quantities.getQuantity(1, Units.KILOGRAM);
,那么
Quantity<Mass> weight = Quantities.getQuantity(1, Units.POUND);
在哪里?

java units-of-measurement
2个回答
4
投票

对于比 SI 单位更广泛的测量,您可以使用 Units ofMeasurement 项目中的一些其他 API(其中包括

indriya
API)。

具体来说,

CLDR
USCustomary
类可能会令人感兴趣。然而,我还没有成功地将不同类别的单元结合起来,例如用于转换(请参阅下面注释掉的代码)。

一些例子:

import javax.measure.Quantity;
import javax.measure.quantity.Length;
import javax.measure.quantity.Mass;

import systems.uom.unicode.CLDR;
import systems.uom.common.USCustomary;

import tec.units.ri.quantity.Quantities;
import tec.units.ri.unit.Units;

...

Quantity<Mass> weight1 = Quantities.getQuantity(1, Units.KILOGRAM);
Quantity<Mass> weight2 = Quantities.getQuantity(1, USCustomary.POUND);
        
// javax.measure.IncommensurableException: kg is not compatible with lb
//Double d2 = Units.KILOGRAM.getConverterTo(CLDR.POUND).convert(1);

Quantity<Mass> weight3 = Quantities.getQuantity(123.45, CLDR.GRAM);
Quantity<Mass> weight4 = Quantities.getQuantity(123.45, CLDR.OUNCE);
Quantity<Mass> weight5 = Quantities.getQuantity(123.45, CLDR.OUNCE_TROY);
        
Double ounces = CLDR.GRAM.getConverterTo(CLDR.OUNCE)
        .convert(weight3.getValue()).doubleValue();
System.out.println(weight3.getValue() + " grams = " + ounces + " ounces");
        
Quantity<Length> dist1 = Quantities.getQuantity(123.45, CLDR.KILOMETER);
Double miles = CLDR.KILOMETER.getConverterTo(CLDR.MILE)
        .convert(dist1.getValue()).doubleValue();
System.out.println(dist1.getValue() + " kilometers = " + miles + " miles");

上述示例的输出是:

123.45 grams = 4.354570602675702 ounces
123.45 kilometers = 76.70827368169888 miles

我的 POM 依赖项是:

<dependencies>
    <dependency>
        <groupId>javax.measure</groupId>
        <artifactId>unit-api</artifactId>
        <version>2.0</version>
    </dependency>
    <dependency>
        <groupId>tec.units</groupId>
        <artifactId>unit-ri</artifactId>
        <version>1.0.3</version>
    </dependency>
    <dependency>
        <groupId>systems.uom</groupId>
        <artifactId>systems-unicode</artifactId>
        <version>2.0.2</version>
    </dependency>
    <dependency>
        <groupId>systems.uom</groupId>
        <artifactId>systems-common</artifactId>
        <version>2.0.2</version>
    </dependency>
    <dependency>
        <groupId>systems.uom</groupId>
        <artifactId>systems-quantity</artifactId>
        <version>2.0.2</version>
    </dependency>
</dependencies>

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 和英制单位,但它的设计方式是,在使用 PhysicalQuantity 时您不必关心它。您可以使用 SI 或英制单位定义任何数量,但在内部它会转换为基本单位。当您想要提取特定单位的值时,您只需选择代表给定数量类型所需单位 SI 或英制的正确方法即可。 库具有 SpringBoot 和 Quarkus 支持的模块以及 Jakarta 验证器的模块,这在 Web 应用程序中可能有用,例如:

@GetMapping("/dry-air")
DryAirResponse getDryAir(@RequestParam @PhysicalRange(min = "-150oC", max = "100F") Temperature temperature);

如果您需要为您的工程领域添加任何特定的单元集,请告诉我!

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