blob: 79de49d35712e806f062fafb72e1e0c62cedea36 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package java.util;
// BEGIN android-added
import org.apache.harmony.luni.util.Msg;
// END android-added
import java.io.Serializable;
/**
* This class represents a currency as identified in the ISO 4217 currency
* codes.
*/
public final class Currency implements Serializable {
private static final long serialVersionUID = -158308464356906721L;
private static Hashtable<String, Currency> codesToCurrencies = new Hashtable<String, Currency>();
private String currencyCode;
// BEGIN android-added
private static String currencyVars = "EURO, HK, PREEURO"; //$NON-NLS-1$
private transient int defaultFractionDigits;
// END android-added
/**
* @param currencyCode
*/
private Currency(String currencyCode) {
this.currencyCode = currencyCode;
}
/**
* Returns the {@code Currency} instance for this currency code.
* <p>
*
* @param currencyCode
* the currency code.
* @return the {@code Currency} instance for this currency code.
*
* @throws IllegalArgumentException
* if the currency code is not a supported ISO 4217 currency
* code.
*/
public static Currency getInstance(String currencyCode) {
Currency currency = codesToCurrencies.get(currencyCode);
if (currency == null) {
// BEGIN android-added
ResourceBundle bundle = Locale.getBundle(
"ISO4CurrenciesToDigits", Locale.getDefault()); //$NON-NLS-1$
currency = new Currency(currencyCode);
String defaultFractionDigits = null;
try {
defaultFractionDigits = bundle.getString(currencyCode);
} catch (MissingResourceException e) {
throw new IllegalArgumentException(
org.apache.harmony.luni.util.Msg.getString(
"K0322", currencyCode)); //$NON-NLS-1$
}
currency.defaultFractionDigits = Integer
.parseInt(defaultFractionDigits);
// END android-added
codesToCurrencies.put(currencyCode, currency);
}
return currency;
}
/**
* Returns the {@code Currency} instance for this {@code Locale}'s country.
*
* @param locale
* the {@code Locale} of a country.
* @return the {@code Currency} used in the country defined by the locale parameter.
*
* @throws IllegalArgumentException
* if the locale's country is not a supported ISO 3166 Country.
*/
public static Currency getInstance(Locale locale) {
// BEGIN android-changed
// com.ibm.icu.util.Currency currency = null;
// try {
// currency = com.ibm.icu.util.Currency.getInstance(locale);
// } catch (IllegalArgumentException e) {
// return null;
// }
// if (currency == null) {
// throw new IllegalArgumentException(locale.getCountry());
// }
// String currencyCode = currency.getCurrencyCode();
String country = locale.getCountry();
String variant = locale.getVariant();
if (!variant.equals("") && currencyVars.indexOf(variant) > -1) { //$NON-NLS-1$
country = country + "_" + variant; //$NON-NLS-1$
}
ResourceBundle bundle = Locale.getBundle(
"ISO4Currencies", Locale.getDefault()); //$NON-NLS-1$
String currencyCode = null;
try {
currencyCode = bundle.getString(country);
} catch (MissingResourceException e) {
throw new IllegalArgumentException(Msg.getString(
"K0323", locale.toString())); //$NON-NLS-1$
}
// END android-changed
if (currencyCode.equals("None")) { //$NON-NLS-1$
return null;
}
return getInstance(currencyCode);
}
/**
* Returns this {@code Currency}'s ISO 4217 currency code.
*
* @return this {@code Currency}'s ISO 4217 currency code.
*/
public String getCurrencyCode() {
return currencyCode;
}
/**
* Returns the symbol for this currency in the default locale. For instance,
* if the default locale is the US, the symbol of the US dollar is "$". For
* other locales it may be "US$". If no symbol can be determined, the ISO
* 4217 currency code of the US dollar is returned.
*
* @return the symbol for this {@code Currency} in the default {@code Locale}.
*/
public String getSymbol() {
return getSymbol(Locale.getDefault());
}
/**
* Returns the symbol for this currency in the given {@code Locale}.
* <p>
* If the locale doesn't have any countries (e.g.
* {@code Locale.JAPANESE, new Locale("en","")}), the the ISO
* 4217 currency code is returned.
* <p>
* First the locale's resource bundle is checked, if the locale has the same currency,
* the CurrencySymbol in this locale bundle is returned.
* <p>
* Then a currency bundle for this locale is searched.
* <p>
* If a currency bundle for this locale does not exist, or there is no
* symbol for this currency in this bundle, then the
* ISO 4217 currency code is returned.
* <p>
*
* @param locale
* the locale for which the currency symbol should be returned.
* @return the representation of this {@code Currency}'s symbol in the specified
* locale.
*/
public String getSymbol(Locale locale) {
if (locale.getCountry().equals("")) { //$NON-NLS-1$
return currencyCode;
}
// BEGIN android-changed
// return com.ibm.icu.util.Currency.getInstance(currencyCode).getSymbol(locale);
// check in the Locale bundle first, if the local has the same currency
ResourceBundle bundle = Locale.getBundle("Locale", locale); //$NON-NLS-1$
if (((String) bundle.getObject("IntCurrencySymbol")) //$NON-NLS-1$
.equals(currencyCode)) {
return (String) bundle.getObject("CurrencySymbol"); //$NON-NLS-1$
}
// search for a Currency bundle
bundle = null;
try {
bundle = Locale.getBundle("Currency", locale); //$NON-NLS-1$
} catch (MissingResourceException e) {
return currencyCode;
}
// is the bundle found for a different country? (for instance the
// default locale's currency bundle)
if (!bundle.getLocale().getCountry().equals(locale.getCountry())) {
return currencyCode;
}
// check if the currency bundle for this locale
// has an entry for this currency
String result = (String) bundle.handleGetObject(currencyCode);
if (result != null) {
return result;
}
return currencyCode;
// END android-changed
}
/**
* Returns the default number of fraction digits for this currency. For
* instance, the default number of fraction digits for the US dollar is 2.
* For the Japanese Yen the number is 0. In the case of pseudo-currencies,
* such as IMF Special Drawing Rights, -1 is returned.
*
* @return the default number of fraction digits for this currency.
*/
public int getDefaultFractionDigits() {
// BEGIN android-changed
// return com.ibm.icu.util.Currency.getInstance(currencyCode).getDefaultFractionDigits();
return defaultFractionDigits;
// END android-changed
}
/**
* Returns this currency's ISO 4217 currency code.
*
* @return this currency's ISO 4217 currency code.
*/
@Override
public String toString() {
return currencyCode;
}
private Object readResolve() {
return getInstance(currencyCode);
}
}