]> granicus.if.org Git - icu/commitdiff
ICU-13060 One more tweak to CurrencyUsage override for backwards compatibility.
authorShane Carr <shane@unicode.org>
Wed, 29 Mar 2017 07:37:12 +0000 (07:37 +0000)
committerShane Carr <shane@unicode.org>
Wed, 29 Mar 2017 07:37:12 +0000 (07:37 +0000)
X-SVN-Rev: 39955

icu4j/main/classes/core/src/com/ibm/icu/impl/number/Rounder.java
icu4j/main/classes/core/src/com/ibm/icu/impl/number/formatters/CurrencyFormat.java
icu4j/main/tests/core/src/com/ibm/icu/dev/test/format/NumberFormatTest.java

index fb28a5f7ec516d0915c1e4f7d120168d62bdb860..5381ad50b7b91131a732cf7752d9813bfc41c65b 100644 (file)
@@ -167,13 +167,13 @@ public abstract class Rounder extends Format.BeforeFormat {
     // For backwards compatibility, minimum overrides maximum if the two conflict.
     // The following logic ensures that there is always a minimum of at least one digit.
     if (_minInt == 0 && _maxFrac != 0) {
-      // Force a digit to the right of the decimal point.
+      // Force a digit after the decimal point.
       minFrac = _minFrac <= 0 ? 1 : _minFrac;
       maxFrac = _maxFrac < 0 ? Integer.MAX_VALUE : _maxFrac < minFrac ? minFrac : _maxFrac;
       minInt = 0;
       maxInt = _maxInt < 0 ? Integer.MAX_VALUE : _maxInt;
     } else {
-      // Force a digit to the left of the decimal point.
+      // Force a digit before the decimal point.
       minFrac = _minFrac < 0 ? 0 : _minFrac;
       maxFrac = _maxFrac < 0 ? Integer.MAX_VALUE : _maxFrac < minFrac ? minFrac : _maxFrac;
       minInt = _minInt <= 0 ? 1 : _minInt;
index 8d499678496e6fdbf03e12bd11943cdf7dd02cee..4930a08373322192bdf862ed6d06af8e41ef0366 100644 (file)
@@ -258,8 +258,16 @@ public class CurrencyFormat {
 
     if (_currencyUsage == null && (_minFrac >= 0 || _maxFrac >= 0)) {
       // User override of fraction length
-      destination.setMinimumFractionDigits(_minFrac);
-      destination.setMaximumFractionDigits(_maxFrac);
+      if (_minFrac < 0) {
+        destination.setMinimumFractionDigits(fractionDigits < _maxFrac ? fractionDigits : _maxFrac);
+        destination.setMaximumFractionDigits(_maxFrac);
+      } else if (_maxFrac < 0) {
+        destination.setMinimumFractionDigits(_minFrac);
+        destination.setMaximumFractionDigits(fractionDigits > _minFrac ? fractionDigits : _minFrac);
+      } else {
+        destination.setMinimumFractionDigits(_minFrac);
+        destination.setMaximumFractionDigits(_maxFrac);
+      }
     } else {
       // Currency rounding
       destination.setMinimumFractionDigits(fractionDigits);
index ec4168a90b6516070edcf550fd5fe91668071727..a680b89fd3326dcaaeb45d9d6ee632b4445cc189 100644 (file)
@@ -5202,6 +5202,20 @@ public class NumberFormatTest extends TestFmwk {
         expect2(df, 1234, "1,234");
     }
 
+    @Test
+    public void testCurrencyUsageFractionOverrides() {
+        NumberFormat df = DecimalFormat.getCurrencyInstance(ULocale.US);
+        expect2(df, 35.0, "$35.00");
+        df.setMinimumFractionDigits(3);
+        expect2(df, 35.0, "$35.000");
+        df.setMaximumFractionDigits(3);
+        expect2(df, 35.0, "$35.000");
+        df.setMinimumFractionDigits(-1);
+        expect2(df, 35.0, "$35.00");
+        df.setMaximumFractionDigits(1);
+        expect2(df, 35.0, "$35.0");
+    }
+
     @Test
     public void testSignificantDigitsMode() {
         String[][] allExpected = {