blob: 29be5f3197d9ac6b214da83c54c7251993ac2f68 [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;
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;
/**
* @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) {
currency = new Currency(currencyCode);
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) {
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();
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;
}
return com.ibm.icu.util.Currency.getInstance(currencyCode).getSymbol(locale);
}
/**
* 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() {
return com.ibm.icu.util.Currency.getInstance(currencyCode).getDefaultFractionDigits();
}
/**
* 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);
}
}