summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNeil Fuller <nfuller@google.com>2014-06-19 13:15:26 +0000
committerAndroid Git Automerger <android-git-automerger@android.com>2014-06-19 13:15:26 +0000
commit3b9d704b6ed8668493a1246a9ea1bc30fa8a2e2b (patch)
treec1fc61d8c2e7953a4a2ae3322ce8624a822bdab8
parentb465afc2e95cf8d18b4925854923a41322322d2e (diff)
parent3019fd32394a00d61bc05ce4e7cb3c949f6143ee (diff)
downloadlibcore-3b9d704b6ed8668493a1246a9ea1bc30fa8a2e2b.zip
libcore-3b9d704b6ed8668493a1246a9ea1bc30fa8a2e2b.tar.gz
libcore-3b9d704b6ed8668493a1246a9ea1bc30fa8a2e2b.tar.bz2
am 3019fd32: am c7531024: Merge "Fix for currency symbol coming from the default locale"
* commit '3019fd32394a00d61bc05ce4e7cb3c949f6143ee': Fix for currency symbol coming from the default locale
-rw-r--r--luni/src/main/java/java/text/DecimalFormat.java5
-rw-r--r--luni/src/main/java/java/util/Currency.java4
-rw-r--r--luni/src/main/java/libcore/icu/NativeDecimalFormat.java6
-rw-r--r--luni/src/test/java/libcore/java/text/DecimalFormatTest.java56
4 files changed, 52 insertions, 19 deletions
diff --git a/luni/src/main/java/java/text/DecimalFormat.java b/luni/src/main/java/java/text/DecimalFormat.java
index fbbc172..dc70886 100644
--- a/luni/src/main/java/java/text/DecimalFormat.java
+++ b/luni/src/main/java/java/text/DecimalFormat.java
@@ -900,8 +900,9 @@ public class DecimalFormat extends NumberFormat {
*/
@Override
public void setCurrency(Currency currency) {
- ndf.setCurrency(Currency.getInstance(currency.getCurrencyCode()));
- symbols.setCurrency(currency);
+ Currency instance = Currency.getInstance(currency.getCurrencyCode());
+ symbols.setCurrency(instance);
+ ndf.setCurrency(symbols.getCurrencySymbol(), currency.getCurrencyCode());
}
/**
diff --git a/luni/src/main/java/java/util/Currency.java b/luni/src/main/java/java/util/Currency.java
index 0b7d227..8cfb68f 100644
--- a/luni/src/main/java/java/util/Currency.java
+++ b/luni/src/main/java/java/util/Currency.java
@@ -146,10 +146,6 @@ public final class Currency implements Serializable {
* <p>If there is no locale-specific currency symbol, the ISO 4217 currency code is returned.
*/
public String getSymbol(Locale locale) {
- if (locale.getCountry().length() == 0) {
- return currencyCode;
- }
-
// Check the locale first, in case the locale has the same currency.
LocaleData localeData = LocaleData.get(locale);
if (localeData.internationalCurrencySymbol.equals(currencyCode)) {
diff --git a/luni/src/main/java/libcore/icu/NativeDecimalFormat.java b/luni/src/main/java/libcore/icu/NativeDecimalFormat.java
index f512002..fd179c1 100644
--- a/luni/src/main/java/libcore/icu/NativeDecimalFormat.java
+++ b/luni/src/main/java/libcore/icu/NativeDecimalFormat.java
@@ -475,9 +475,9 @@ public final class NativeDecimalFormat implements Cloneable {
setAttribute(this.address, UNUM_DECIMAL_ALWAYS_SHOWN, i);
}
- public void setCurrency(Currency currency) {
- setSymbol(this.address, UNUM_CURRENCY_SYMBOL, currency.getSymbol());
- setSymbol(this.address, UNUM_INTL_CURRENCY_SYMBOL, currency.getCurrencyCode());
+ public void setCurrency(String currencySymbol, String currencyCode) {
+ setSymbol(this.address, UNUM_CURRENCY_SYMBOL, currencySymbol);
+ setSymbol(this.address, UNUM_INTL_CURRENCY_SYMBOL, currencyCode);
}
public void setGroupingSize(int value) {
diff --git a/luni/src/test/java/libcore/java/text/DecimalFormatTest.java b/luni/src/test/java/libcore/java/text/DecimalFormatTest.java
index 722924d..0eae20a 100644
--- a/luni/src/test/java/libcore/java/text/DecimalFormatTest.java
+++ b/luni/src/test/java/libcore/java/text/DecimalFormatTest.java
@@ -124,21 +124,21 @@ public class DecimalFormatTest extends junit.framework.TestCase {
df.setMaximumFractionDigits(2);
df.setMultiplier(2);
assertEquals(df.format(BigDecimal.valueOf(0.16)),
- df.format(BigDecimal.valueOf(0.16).doubleValue()));
+ df.format(BigDecimal.valueOf(0.16).doubleValue()));
assertEquals(df.format(BigDecimal.valueOf(0.0293)),
- df.format(BigDecimal.valueOf(0.0293).doubleValue()));
+ df.format(BigDecimal.valueOf(0.0293).doubleValue()));
assertEquals(df.format(BigDecimal.valueOf(0.006)),
- df.format(BigDecimal.valueOf(0.006).doubleValue()));
+ df.format(BigDecimal.valueOf(0.006).doubleValue()));
assertEquals(df.format(BigDecimal.valueOf(0.00283)),
- df.format(BigDecimal.valueOf(0.00283).doubleValue()));
+ df.format(BigDecimal.valueOf(0.00283).doubleValue()));
assertEquals(df.format(BigDecimal.valueOf(1.60)),
df.format(BigDecimal.valueOf(1.60).doubleValue()));
assertEquals(df.format(BigDecimal.valueOf(15)),
- df.format(BigDecimal.valueOf(15).doubleValue()));
+ df.format(BigDecimal.valueOf(15).doubleValue()));
assertEquals(df.format(BigDecimal.valueOf(170)),
- df.format(BigDecimal.valueOf(170).doubleValue()));
+ df.format(BigDecimal.valueOf(170).doubleValue()));
assertEquals(df.format(BigDecimal.valueOf(234.56)),
- df.format(BigDecimal.valueOf(234.56).doubleValue()));
+ df.format(BigDecimal.valueOf(234.56).doubleValue()));
assertEquals(df.format(BigDecimal.valueOf(0)),
df.format(BigDecimal.valueOf(0).doubleValue()));
assertEquals(df.format(BigDecimal.valueOf(-1)),
@@ -146,11 +146,11 @@ public class DecimalFormatTest extends junit.framework.TestCase {
assertEquals(df.format(BigDecimal.valueOf(-10000)),
df.format(BigDecimal.valueOf(-10000).doubleValue()));
assertEquals(df.format(BigDecimal.valueOf(-0.001)),
- df.format(BigDecimal.valueOf(-0.001).doubleValue()));
+ df.format(BigDecimal.valueOf(-0.001).doubleValue()));
assertEquals(df.format(BigDecimal.valueOf(1234567890.1234567)),
- df.format(BigDecimal.valueOf(1234567890.1234567).doubleValue()));
+ df.format(BigDecimal.valueOf(1234567890.1234567).doubleValue()));
assertEquals(df.format(BigDecimal.valueOf(1.234567E100)),
- df.format(BigDecimal.valueOf(1.234567E100).doubleValue()));
+ df.format(BigDecimal.valueOf(1.234567E100).doubleValue()));
}
private void assertBigDecimalWithFraction(BigDecimal bd, String expectedResult, int fraction) {
@@ -282,4 +282,40 @@ public class DecimalFormatTest extends junit.framework.TestCase {
assertEquals(expected, numberFormat.format(2.01));
}
+
+ // Confirm the currency symbol used by a format is determined by the locale of the format
+ // not the current default Locale.
+ public void testSetCurrency_symbolOrigin() {
+ Currency currency = Currency.getInstance("CNY");
+ Locale locale1 = Locale.CHINA;
+ Locale locale2 = Locale.US;
+ String locale1Symbol = currency.getSymbol(locale1);
+ String locale2Symbol = currency.getSymbol(locale2);
+ // This test only works if we can tell where the symbol came from, which requires they are
+ // different across the two locales chosen.
+ assertFalse(locale1Symbol.equals(locale2Symbol));
+
+ Locale originalLocale = Locale.getDefault();
+ try {
+ Locale.setDefault(locale1);
+ String amountDefaultLocale1 =
+ formatArbitraryCurrencyAmountInLocale(currency, locale2);
+
+ Locale.setDefault(locale2);
+ String amountDefaultLocale2 =
+ formatArbitraryCurrencyAmountInLocale(currency, locale2);
+
+ // This used to fail because Currency.getSymbol() was used without providing the
+ // format's locale.
+ assertEquals(amountDefaultLocale1, amountDefaultLocale2);
+ } finally {
+ Locale.setDefault(originalLocale);
+ }
+ }
+
+ private String formatArbitraryCurrencyAmountInLocale(Currency currency, Locale locale) {
+ NumberFormat localeCurrencyFormat = NumberFormat.getCurrencyInstance(locale);
+ localeCurrencyFormat.setCurrency(currency);
+ return localeCurrencyFormat.format(1000);
+ }
}