From 6616bebf9f34e09430854818b19708233554d373 Mon Sep 17 00:00:00 2001 From: Shane Carr Date: Wed, 29 Mar 2017 07:37:12 +0000 Subject: [PATCH] ICU-13060 One more tweak to CurrencyUsage override for backwards compatibility. X-SVN-Rev: 39955 --- .../core/src/com/ibm/icu/impl/number/Rounder.java | 4 ++-- .../icu/impl/number/formatters/CurrencyFormat.java | 12 ++++++++++-- .../ibm/icu/dev/test/format/NumberFormatTest.java | 14 ++++++++++++++ 3 files changed, 26 insertions(+), 4 deletions(-) diff --git a/icu4j/main/classes/core/src/com/ibm/icu/impl/number/Rounder.java b/icu4j/main/classes/core/src/com/ibm/icu/impl/number/Rounder.java index fb28a5f7ec5..5381ad50b7b 100644 --- a/icu4j/main/classes/core/src/com/ibm/icu/impl/number/Rounder.java +++ b/icu4j/main/classes/core/src/com/ibm/icu/impl/number/Rounder.java @@ -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; diff --git a/icu4j/main/classes/core/src/com/ibm/icu/impl/number/formatters/CurrencyFormat.java b/icu4j/main/classes/core/src/com/ibm/icu/impl/number/formatters/CurrencyFormat.java index 8d499678496..4930a083733 100644 --- a/icu4j/main/classes/core/src/com/ibm/icu/impl/number/formatters/CurrencyFormat.java +++ b/icu4j/main/classes/core/src/com/ibm/icu/impl/number/formatters/CurrencyFormat.java @@ -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); diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/format/NumberFormatTest.java b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/format/NumberFormatTest.java index ec4168a90b6..a680b89fd33 100644 --- a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/format/NumberFormatTest.java +++ b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/format/NumberFormatTest.java @@ -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 = { -- 2.40.0