diff --git a/icu4j/main/core/src/main/java/com/ibm/icu/impl/units/ConversionRates.java b/icu4j/main/core/src/main/java/com/ibm/icu/impl/units/ConversionRates.java index 3aa643d71568..d8aae8667125 100644 --- a/icu4j/main/core/src/main/java/com/ibm/icu/impl/units/ConversionRates.java +++ b/icu4j/main/core/src/main/java/com/ibm/icu/impl/units/ConversionRates.java @@ -57,6 +57,10 @@ public UnitsConverter.Factor getFactorToBase(MeasureUnitImpl measureUnit) { result = result.multiply(getFactorToBase(singleUnit)); } + if (measureUnit.getConstantDenominator() != 0) { + result = result.divide(BigDecimal.valueOf(measureUnit.getConstantDenominator())); + } + return result; } diff --git a/icu4j/main/core/src/main/java/com/ibm/icu/impl/units/UnitsConverter.java b/icu4j/main/core/src/main/java/com/ibm/icu/impl/units/UnitsConverter.java index fffb70b32fed..10e14d8a824a 100644 --- a/icu4j/main/core/src/main/java/com/ibm/icu/impl/units/UnitsConverter.java +++ b/icu4j/main/core/src/main/java/com/ibm/icu/impl/units/UnitsConverter.java @@ -546,6 +546,12 @@ public Factor multiply(Factor other) { return result; } + public Factor divide(BigDecimal value) { + Factor result = this.copy(); + result.factorDen = this.factorDen.multiply(value); + return result; + } + /** * Adds Entity with power or not. For example, {@code 12 ^ 3} or {@code 12}. * diff --git a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/impl/UnitsTest.java b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/impl/UnitsTest.java index cc4f9e024b0b..afc28b0dc06d 100644 --- a/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/impl/UnitsTest.java +++ b/icu4j/main/core/src/test/java/com/ibm/icu/dev/test/impl/UnitsTest.java @@ -507,6 +507,25 @@ class TestData { new TestData("dot-per-centimeter", "pixel-per-centimeter", 1.0, 1.0), new TestData("dot-per-inch", "pixel-per-inch", 1.0, 1.0), new TestData("dot", "pixel", 1.0, 1.0), + + // With constants + new TestData("meter-per-10", "foot", 1.0, 0.328084), + new TestData("meter", "foot-per-10", 1.0, 32.8084), + new TestData("meter", "foot-per-100", 1.0, 328.084), + new TestData("portion", "portion-per-1000", 1.0, 1000), + new TestData("portion", "portion-per-10000", 1.0, 10000), + new TestData("portion", "portion-per-100000", 1.0, 100000), + new TestData("portion", "portion-per-1000000", 1.0, 1000000), + new TestData("portion-per-10", "portion", 1.0, 0.1), + new TestData("portion-per-100", "portion", 1.0, 0.01), + new TestData("portion-per-1000", "portion", 1.0, 0.001), + new TestData("portion-per-10000", "portion", 1.0, 0.0001), + new TestData("portion-per-100000", "portion", 1.0, 0.00001), + new TestData("portion-per-1000000", "portion", 1.0, 0.000001), + new TestData("mile-per-hour", "meter-per-second", 1.0, 0.44704), + new TestData("mile-per-100-hour", "meter-per-100-second", 1.0, 0.44704), + new TestData("mile-per-hour", "meter-per-100-second", 1.0, 44.704), + new TestData("mile-per-100-hour", "meter-per-second", 1.0, 0.0044704), }; ConversionRates conversionRates = new ConversionRates();