英文:
US/Imperial units with Java's Units of Measurement API
问题
我只在Java度量单位标准的Indriya 2.0.4参考实现中看到了公制单位。肯定有其他人想要使用英尺、英寸和英里,但我找不到相关信息。有人可以告诉我我漏掉了什么吗?
我可以这样做:Quantity<Mass> weight = Quantities.getQuantity(1, Units.KILOGRAM);
,那么Quantity<Mass> weight = Quantities.getQuantity(1, Units.POUND);
在哪里呢?
英文:
I'm only seeing metric units in the Indriya 2.0.4 reference implementation of the Java Units of Measurement standard. Surely other people have wanted to work with feet, inches, and miles, but I can't find anything about that. Can anyone tell me what I'm missing here?
I can do Quantity<Mass> weight = Quantities.getQuantity(1, Units.KILOGRAM);
, so where is Quantity<Mass> weight = Quantities.getQuantity(1, Units.POUND);
?
答案1
得分: 2
以下是翻译好的内容:
对于超出国际单位制的测量,您可以使用Units of Measurement项目中的其他一些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>
英文:
For measurements which are wider than just SI units, you can use some of the other APIs in the Units of Measurement project (which includes the indriya
API).
Specifically, the CLDR
and USCustomary
classes may be of interest. However, I have not had success combining units from different classes, e.g. for conversions (see the commented-out code below).
Some examples:
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");
The outputs from the above examples are:
123.45 grams = 4.354570602675702 ounces
123.45 kilometers = 76.70827368169888 miles
My POM dependencies for this are:
<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>
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论