[uom] add metric area/volume units (#5184)

* add metric volume units

Signed-off-by: Hans Böhm <h.boehm@gmx.at>
This commit is contained in:
Hans Böhm
2025-12-27 23:10:37 +01:00
committed by GitHub
parent 6e3d23f9ce
commit 8277a33720
2 changed files with 41 additions and 0 deletions
@@ -20,6 +20,7 @@ import javax.measure.Unit;
import javax.measure.quantity.Acceleration;
import javax.measure.quantity.AmountOfSubstance;
import javax.measure.quantity.Angle;
import javax.measure.quantity.Area;
import javax.measure.quantity.CatalyticActivity;
import javax.measure.quantity.Dimensionless;
import javax.measure.quantity.ElectricCapacitance;
@@ -96,6 +97,15 @@ public final class Units extends CustomUnits {
MetricPrefix.MILLI(Units.MOLE).divide(Units.LITRE), MultiplyConverter.of(0.17833)));
public static final Unit<Angle> DEGREE_ANGLE = addUnit(NonSI.DEGREE_ANGLE);
public static final Unit<Angle> RADIAN = addUnit(tech.units.indriya.unit.Units.RADIAN);
public static final Unit<Area> SQUARE_MILLIMETRE = addUnit(
new ProductUnit<Area>(MetricPrefix.MILLI(tech.units.indriya.unit.Units.METRE)
.multiply(MetricPrefix.MILLI(tech.units.indriya.unit.Units.METRE))));
public static final Unit<Area> SQUARE_CENTIMETRE = addUnit(
new ProductUnit<Area>(MetricPrefix.CENTI(tech.units.indriya.unit.Units.METRE)
.multiply(MetricPrefix.CENTI(tech.units.indriya.unit.Units.METRE))));
public static final Unit<Area> SQUARE_KILOMETRE = addUnit(
new ProductUnit<Area>(MetricPrefix.KILO(tech.units.indriya.unit.Units.METRE)
.multiply(MetricPrefix.KILO(tech.units.indriya.unit.Units.METRE))));
public static final Unit<ArealDensity> DOBSON_UNIT = addUnit(
new ProductUnit<>(MetricPrefix.MILLI(tech.units.indriya.unit.Units.MOLE).multiply(0.4462)
.divide(tech.units.indriya.unit.Units.SQUARE_METRE)));
@@ -203,6 +213,8 @@ public final class Units extends CustomUnits {
public static final Unit<Time> WEEK = addUnit(tech.units.indriya.unit.Units.WEEK);
public static final Unit<Time> MONTH = addUnit(tech.units.indriya.unit.Units.MONTH);
public static final Unit<Time> YEAR = addUnit(tech.units.indriya.unit.Units.YEAR);
public static final Unit<Volume> CUBIC_MILLIMETRE = addUnit(Units.LITRE.divide(1000000));
public static final Unit<Volume> CUBIC_CENTIMETRE = addUnit(Units.LITRE.divide(1000));
public static final Unit<VolumetricFlowRate> LITRE_PER_MINUTE = addUnit(
new ProductUnit<>(tech.units.indriya.unit.Units.LITRE.divide(tech.units.indriya.unit.Units.MINUTE)));
public static final Unit<VolumetricFlowRate> CUBICMETRE_PER_SECOND = addUnit(
@@ -262,6 +274,8 @@ public final class Units extends CustomUnits {
SimpleUnitFormat.getInstance().label(MICRO_CURIE, "µCi");
SimpleUnitFormat.getInstance().label(NANO_CURIE, "nCi");
SimpleUnitFormat.getInstance().label(PICO_CURIE, "pCi");
SimpleUnitFormat.getInstance().label(CUBIC_CENTIMETRE, "cm³");
SimpleUnitFormat.getInstance().label(CUBIC_MILLIMETRE, "mm³");
SimpleUnitFormat.getInstance().label(CUBICMETRE_PER_DAY, "m³/d");
SimpleUnitFormat.getInstance().label(CUBICMETRE_PER_HOUR, "m³/h");
SimpleUnitFormat.getInstance().label(CUBICMETRE_PER_MINUTE, "m³/min");
@@ -289,6 +303,7 @@ public final class Units extends CustomUnits {
SimpleUnitFormat.getInstance().label(KILOVOLT_AMPERE, "kVA");
SimpleUnitFormat.getInstance().label(KILOWATT_HOUR, "kWh");
SimpleUnitFormat.getInstance().label(KNOT, KNOT.getSymbol());
SimpleUnitFormat.getInstance().alias(LITRE, "dm³");
SimpleUnitFormat.getInstance().label(LITRE_PER_MINUTE, "l/min");
SimpleUnitFormat.getInstance().label(MEGABYTE, "MB");
SimpleUnitFormat.getInstance().label(MEBIBYTE, "MiB");
@@ -311,6 +326,9 @@ public final class Units extends CustomUnits {
SimpleUnitFormat.getInstance().alias(PEBIBYTE, "Pio");
SimpleUnitFormat.getInstance().label(PETABIT, "Pbit");
SimpleUnitFormat.getInstance().label(RPM, "rpm");
SimpleUnitFormat.getInstance().label(SQUARE_CENTIMETRE, "cm²");
SimpleUnitFormat.getInstance().label(SQUARE_KILOMETRE, "km²");
SimpleUnitFormat.getInstance().label(SQUARE_MILLIMETRE, "mm²");
SimpleUnitFormat.getInstance().label(STANDARD_GRAVITY, "gₙ");
SimpleUnitFormat.getInstance().label(SIEMENS_PER_METRE, "S/m");
SimpleUnitFormat.getInstance().label(TERABYTE, "TB");
@@ -21,6 +21,7 @@ import static org.junit.jupiter.api.Assertions.*;
import java.math.BigDecimal;
import javax.measure.Quantity;
import javax.measure.quantity.Area;
import javax.measure.quantity.Dimensionless;
import javax.measure.quantity.Energy;
import javax.measure.quantity.Length;
@@ -384,6 +385,28 @@ public class UnitsTest {
assertEquals("0.05 %", ppm.toUnit(Units.PERCENT).toString());
}
@Test
public void testSquareCmConversion() {
QuantityType<Area> m2 = new QuantityType<>("1 m²");
QuantityType<Area> mm2 = new QuantityType<>("100 mm²");
QuantityType<Area> km2 = new QuantityType<>("1 km²");
assertEquals(10000.0, m2.toUnit("cm²").doubleValue(), DEFAULT_ERROR);
assertEquals(1.0, mm2.toUnit("cm²").doubleValue(), DEFAULT_ERROR);
assertEquals(1000000.0, km2.toUnit("").doubleValue(), DEFAULT_ERROR);
}
@Test
public void testCubicCmConversion() {
QuantityType<Volume> l = new QuantityType<>("1 l");
QuantityType<Volume> cm3 = new QuantityType<>("1000 cm³");
QuantityType<Volume> mm3 = new QuantityType<>("1000 mm³");
assertEquals(1.0, l.toUnit("dm³").doubleValue(), DEFAULT_ERROR);
assertEquals(1.0, cm3.toUnit("l").doubleValue(), DEFAULT_ERROR);
assertEquals(1.0, mm3.toUnit("cm³").doubleValue(), DEFAULT_ERROR);
}
@Test
public void testDb() {
QuantityType<Dimensionless> ratio = new QuantityType<>("100");