From 5897f50a4a882080aa0288ff4a4677546df77110 Mon Sep 17 00:00:00 2001 From: macchiati Date: Mon, 13 May 2024 17:18:06 -0700 Subject: [PATCH 1/4] CLDR-17298 Add parts per billion --- common/main/en.xml | 15 +++++++++++++++ common/main/root.xml | 4 ++++ 2 files changed, 19 insertions(+) diff --git a/common/main/en.xml b/common/main/en.xml index 771ee697ba2..97596cec099 100644 --- a/common/main/en.xml +++ b/common/main/en.xml @@ -6886,6 +6886,11 @@ annotations. {0} part per million {0} parts per million + + parts per billion + {0} part per billion + {0} parts per billion + percent {0} percent @@ -7965,6 +7970,11 @@ annotations. {0} ppm {0} ppm + + parts/billion + {0} ppb + {0} ppb + percent {0}% @@ -9041,6 +9051,11 @@ annotations. {0}ppm {0}ppm + + ppb + {0}ppb + {0}ppb + % {0}% diff --git a/common/main/root.xml b/common/main/root.xml index 4ccb65620f0..7b48cfdb9aa 100644 --- a/common/main/root.xml +++ b/common/main/root.xml @@ -5101,6 +5101,10 @@ Warnings: All cp values have U+FE0F characters removed. See /annotationsDerived/ ppm {0} ppm + + ppb + {0} ppb + % {0}% From baced1b5ec0c1206fb3a5203538b649438e9e69b Mon Sep 17 00:00:00 2001 From: macchiati Date: Tue, 14 May 2024 10:59:01 -0700 Subject: [PATCH 2/4] CLDR-17298 Fixes for tests --- common/validity/unit.xml | 1 + tools/cldr-code/src/main/java/org/unicode/cldr/util/DtdData.java | 1 + 2 files changed, 2 insertions(+) diff --git a/common/validity/unit.xml b/common/validity/unit.xml index 65cba0bd2cb..2b07aa44b75 100644 --- a/common/validity/unit.xml +++ b/common/validity/unit.xml @@ -239,6 +239,7 @@ For terms of use, see http://www.unicode.org/copyright.html volume-sai volume-to-jp volume-koku + concentr-portion-per-1e9 mass-fun duration-night diff --git a/tools/cldr-code/src/main/java/org/unicode/cldr/util/DtdData.java b/tools/cldr-code/src/main/java/org/unicode/cldr/util/DtdData.java index 00a52df742b..e98963b2c36 100644 --- a/tools/cldr-code/src/main/java/org/unicode/cldr/util/DtdData.java +++ b/tools/cldr-code/src/main/java/org/unicode/cldr/util/DtdData.java @@ -1870,6 +1870,7 @@ private static final class UnitOrderHolder { "volume-to-jp", "volume-koku", "mass-fun", + "concentr-portion-per-1e9", "duration-night")) .freeze(); } From 1cec5dc1088e29c0b1ceb22a4faf4dcd4581ff3a Mon Sep 17 00:00:00 2001 From: macchiati Date: Tue, 14 May 2024 13:55:48 -0700 Subject: [PATCH 3/4] CLDR-17298 Catch case where the denominator is just a constant; also format with e notation. --- .../org/unicode/cldr/util/UnitConverter.java | 30 ++++++- .../org/unicode/cldr/unittest/TestUnits.java | 78 ++++++++++--------- 2 files changed, 70 insertions(+), 38 deletions(-) diff --git a/tools/cldr-code/src/main/java/org/unicode/cldr/util/UnitConverter.java b/tools/cldr-code/src/main/java/org/unicode/cldr/util/UnitConverter.java index 9da77ae9364..44620cfbb13 100644 --- a/tools/cldr-code/src/main/java/org/unicode/cldr/util/UnitConverter.java +++ b/tools/cldr-code/src/main/java/org/unicode/cldr/util/UnitConverter.java @@ -1073,6 +1073,7 @@ public int compare(String o1, String o2) { } Comparator UNIT_COMPARATOR = new UnitComparator(); + static final Pattern TRAILING_ZEROS = Pattern.compile("0+$"); /** Only handles the canonical units; no kilo-, only normalized, etc. */ // Thus we do not need to handle specials here @@ -1174,7 +1175,7 @@ public String toString() { for (int i = 1; i >= 0; --i) { // two passes, numerator then den. boolean positivePass = i > 0; if (positivePass && !factor.numerator.equals(BigInteger.ONE)) { - builder.append(factor.numerator); + builder.append(shortConstant(factor.numerator)); } Map target = positivePass ? numUnitsToPowers : denUnitsToPowers; @@ -1190,7 +1191,7 @@ public String toString() { firstDenominator = false; builder.append("per-"); if (!factor.denominator.equals(BigInteger.ONE)) { - builder.append(factor.denominator).append('-'); + builder.append(shortConstant(factor.denominator)).append('-'); } } } @@ -1213,10 +1214,35 @@ public String toString() { } builder.append(unit); } + if (!positivePass + && firstDenominator + && !factor.denominator.equals(BigInteger.ONE)) { + builder.append("-per-").append(shortConstant(factor.denominator)); + } } return builder.toString(); } + /** + * Return a string format. If larger than 7 digits, use 1eN format. + * + * @param source + * @return + */ + public String shortConstant(BigInteger source) { + // don't bother optimizing + String result = source.toString(); + if (result.length() < 8) { + return result; + } + Matcher matcher = TRAILING_ZEROS.matcher(result); + if (matcher.find()) { + int zeroCount = matcher.group().length(); + return result.substring(0, result.length() - zeroCount) + "e" + zeroCount; + } + return result; + } + public String toString( LocaleStringProvider resolvedFile, String width, diff --git a/tools/cldr-code/src/test/java/org/unicode/cldr/unittest/TestUnits.java b/tools/cldr-code/src/test/java/org/unicode/cldr/unittest/TestUnits.java index dc0931a07b3..6904d41efa4 100644 --- a/tools/cldr-code/src/test/java/org/unicode/cldr/unittest/TestUnits.java +++ b/tools/cldr-code/src/test/java/org/unicode/cldr/unittest/TestUnits.java @@ -1,41 +1,5 @@ package org.unicode.cldr.unittest; -import com.google.common.base.Joiner; -import com.google.common.base.Splitter; -import com.google.common.collect.BiMap; -import com.google.common.collect.Comparators; -import com.google.common.collect.ComparisonChain; -import com.google.common.collect.HashMultimap; -import com.google.common.collect.ImmutableList; -import com.google.common.collect.ImmutableMap; -import com.google.common.collect.ImmutableMultimap; -import com.google.common.collect.ImmutableSet; -import com.google.common.collect.ImmutableSortedSet; -import com.google.common.collect.LinkedHashMultimap; -import com.google.common.collect.Multimap; -import com.google.common.collect.Multimaps; -import com.google.common.collect.Ordering; -import com.google.common.collect.Sets; -import com.google.common.collect.Sets.SetView; -import com.google.common.collect.TreeMultimap; -import com.ibm.icu.dev.test.TestFmwk; -import com.ibm.icu.impl.Row; -import com.ibm.icu.impl.Row.R2; -import com.ibm.icu.impl.Row.R3; -import com.ibm.icu.number.FormattedNumber; -import com.ibm.icu.number.LocalizedNumberFormatter; -import com.ibm.icu.number.Notation; -import com.ibm.icu.number.NumberFormatter; -import com.ibm.icu.number.NumberFormatter.UnitWidth; -import com.ibm.icu.number.Precision; -import com.ibm.icu.number.UnlocalizedNumberFormatter; -import com.ibm.icu.text.PluralRules; -import com.ibm.icu.text.UnicodeSet; -import com.ibm.icu.util.ICUUncheckedIOException; -import com.ibm.icu.util.Measure; -import com.ibm.icu.util.MeasureUnit; -import com.ibm.icu.util.Output; -import com.ibm.icu.util.ULocale; import java.io.File; import java.io.IOException; import java.io.OutputStreamWriter; @@ -68,6 +32,7 @@ import java.util.stream.Collectors; import java.util.stream.Stream; import java.util.stream.StreamSupport; + import org.unicode.cldr.draft.FileUtilities; import org.unicode.cldr.test.CheckCLDR.CheckStatus; import org.unicode.cldr.test.CheckCLDR.Options; @@ -124,6 +89,43 @@ import org.unicode.cldr.util.XMLSource; import org.unicode.cldr.util.XPathParts; +import com.google.common.base.Joiner; +import com.google.common.base.Splitter; +import com.google.common.collect.BiMap; +import com.google.common.collect.Comparators; +import com.google.common.collect.ComparisonChain; +import com.google.common.collect.HashMultimap; +import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.ImmutableMultimap; +import com.google.common.collect.ImmutableSet; +import com.google.common.collect.ImmutableSortedSet; +import com.google.common.collect.LinkedHashMultimap; +import com.google.common.collect.Multimap; +import com.google.common.collect.Multimaps; +import com.google.common.collect.Ordering; +import com.google.common.collect.Sets; +import com.google.common.collect.Sets.SetView; +import com.google.common.collect.TreeMultimap; +import com.ibm.icu.dev.test.TestFmwk; +import com.ibm.icu.impl.Row; +import com.ibm.icu.impl.Row.R2; +import com.ibm.icu.impl.Row.R3; +import com.ibm.icu.number.FormattedNumber; +import com.ibm.icu.number.LocalizedNumberFormatter; +import com.ibm.icu.number.Notation; +import com.ibm.icu.number.NumberFormatter; +import com.ibm.icu.number.NumberFormatter.UnitWidth; +import com.ibm.icu.number.Precision; +import com.ibm.icu.number.UnlocalizedNumberFormatter; +import com.ibm.icu.text.PluralRules; +import com.ibm.icu.text.UnicodeSet; +import com.ibm.icu.util.ICUUncheckedIOException; +import com.ibm.icu.util.Measure; +import com.ibm.icu.util.MeasureUnit; +import com.ibm.icu.util.Output; +import com.ibm.icu.util.ULocale; + public class TestUnits extends TestFmwk { private static final boolean DEBUG = System.getProperty("TestUnits:DEBUG") != null; private static final boolean TEST_ICU = System.getProperty("TestUnits:TEST_ICU") != null; @@ -3197,6 +3199,10 @@ public void TestUnitOrder() { checkNormalization("test case", "newton-meter"); checkNormalization("test case", "acre-foot"); + checkNormalization("test case", "portion-per-1e9"); + checkNormalization("test case", "portion-per-1000"); + checkNormalization("test case", "1e9-meter"); + checkNormalization("test case", "1000-meter"); String stdAcre = converter.getStandardUnit("acre"); From 79fa59bad2d8cbf0b6983f6ff023420c8e1ae724 Mon Sep 17 00:00:00 2001 From: macchiati Date: Tue, 14 May 2024 14:37:55 -0700 Subject: [PATCH 4/4] CLDR-17298 Fix formatting that Eclipse messes up --- .../org/unicode/cldr/unittest/TestUnits.java | 74 +++++++++---------- 1 file changed, 36 insertions(+), 38 deletions(-) diff --git a/tools/cldr-code/src/test/java/org/unicode/cldr/unittest/TestUnits.java b/tools/cldr-code/src/test/java/org/unicode/cldr/unittest/TestUnits.java index 6904d41efa4..cedbe5e3dd4 100644 --- a/tools/cldr-code/src/test/java/org/unicode/cldr/unittest/TestUnits.java +++ b/tools/cldr-code/src/test/java/org/unicode/cldr/unittest/TestUnits.java @@ -1,5 +1,41 @@ package org.unicode.cldr.unittest; +import com.google.common.base.Joiner; +import com.google.common.base.Splitter; +import com.google.common.collect.BiMap; +import com.google.common.collect.Comparators; +import com.google.common.collect.ComparisonChain; +import com.google.common.collect.HashMultimap; +import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.ImmutableMultimap; +import com.google.common.collect.ImmutableSet; +import com.google.common.collect.ImmutableSortedSet; +import com.google.common.collect.LinkedHashMultimap; +import com.google.common.collect.Multimap; +import com.google.common.collect.Multimaps; +import com.google.common.collect.Ordering; +import com.google.common.collect.Sets; +import com.google.common.collect.Sets.SetView; +import com.google.common.collect.TreeMultimap; +import com.ibm.icu.dev.test.TestFmwk; +import com.ibm.icu.impl.Row; +import com.ibm.icu.impl.Row.R2; +import com.ibm.icu.impl.Row.R3; +import com.ibm.icu.number.FormattedNumber; +import com.ibm.icu.number.LocalizedNumberFormatter; +import com.ibm.icu.number.Notation; +import com.ibm.icu.number.NumberFormatter; +import com.ibm.icu.number.NumberFormatter.UnitWidth; +import com.ibm.icu.number.Precision; +import com.ibm.icu.number.UnlocalizedNumberFormatter; +import com.ibm.icu.text.PluralRules; +import com.ibm.icu.text.UnicodeSet; +import com.ibm.icu.util.ICUUncheckedIOException; +import com.ibm.icu.util.Measure; +import com.ibm.icu.util.MeasureUnit; +import com.ibm.icu.util.Output; +import com.ibm.icu.util.ULocale; import java.io.File; import java.io.IOException; import java.io.OutputStreamWriter; @@ -32,7 +68,6 @@ import java.util.stream.Collectors; import java.util.stream.Stream; import java.util.stream.StreamSupport; - import org.unicode.cldr.draft.FileUtilities; import org.unicode.cldr.test.CheckCLDR.CheckStatus; import org.unicode.cldr.test.CheckCLDR.Options; @@ -89,43 +124,6 @@ import org.unicode.cldr.util.XMLSource; import org.unicode.cldr.util.XPathParts; -import com.google.common.base.Joiner; -import com.google.common.base.Splitter; -import com.google.common.collect.BiMap; -import com.google.common.collect.Comparators; -import com.google.common.collect.ComparisonChain; -import com.google.common.collect.HashMultimap; -import com.google.common.collect.ImmutableList; -import com.google.common.collect.ImmutableMap; -import com.google.common.collect.ImmutableMultimap; -import com.google.common.collect.ImmutableSet; -import com.google.common.collect.ImmutableSortedSet; -import com.google.common.collect.LinkedHashMultimap; -import com.google.common.collect.Multimap; -import com.google.common.collect.Multimaps; -import com.google.common.collect.Ordering; -import com.google.common.collect.Sets; -import com.google.common.collect.Sets.SetView; -import com.google.common.collect.TreeMultimap; -import com.ibm.icu.dev.test.TestFmwk; -import com.ibm.icu.impl.Row; -import com.ibm.icu.impl.Row.R2; -import com.ibm.icu.impl.Row.R3; -import com.ibm.icu.number.FormattedNumber; -import com.ibm.icu.number.LocalizedNumberFormatter; -import com.ibm.icu.number.Notation; -import com.ibm.icu.number.NumberFormatter; -import com.ibm.icu.number.NumberFormatter.UnitWidth; -import com.ibm.icu.number.Precision; -import com.ibm.icu.number.UnlocalizedNumberFormatter; -import com.ibm.icu.text.PluralRules; -import com.ibm.icu.text.UnicodeSet; -import com.ibm.icu.util.ICUUncheckedIOException; -import com.ibm.icu.util.Measure; -import com.ibm.icu.util.MeasureUnit; -import com.ibm.icu.util.Output; -import com.ibm.icu.util.ULocale; - public class TestUnits extends TestFmwk { private static final boolean DEBUG = System.getProperty("TestUnits:DEBUG") != null; private static final boolean TEST_ICU = System.getProperty("TestUnits:TEST_ICU") != null;