All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.erudika.para.i18n.CurrencyUtils Maven / Gradle / Ivy

The newest version!
/*
 * Copyright 2013-2015 Erudika. http://erudika.com
 *
 * Licensed 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.
 *
 * For issues and patches go to: https://github.com/erudika
 */
package com.erudika.para.i18n;

import java.text.NumberFormat;
import java.util.Currency;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
import java.util.TreeMap;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * Helper utility class for currency operations.
 * @author Alex Bogdanovski [[email protected]]
 */
public final class CurrencyUtils {

	private static final Logger logger = LoggerFactory.getLogger(CurrencyUtils.class);

	private static final Map COUNTRY_TO_LOCALE_MAP = new HashMap();
	private static final Map CURRENCY_TO_LOCALE_MAP = new HashMap();
	private static final Map CURRENCIES_MAP = new TreeMap();

	private static CurrencyUtils instance;

	private CurrencyUtils() {
		Locale[] locales = Locale.getAvailableLocales();
		try {
			for (Locale l : locales) {
				if (!StringUtils.isBlank(l.getCountry())) {
					COUNTRY_TO_LOCALE_MAP.put(l.getCountry(), l);
					Currency c = Currency.getInstance(l);
					if (c != null) {
						CURRENCY_TO_LOCALE_MAP.put(c.getCurrencyCode(), l);
						CURRENCIES_MAP.put(c.getCurrencyCode(), getCurrencyName(c.getCurrencyCode(),
								Locale.US).concat(" ").concat(c.getSymbol(l)));
					}
				}
			}
			// overwrite main locales
			CURRENCY_TO_LOCALE_MAP.put("USD", Locale.US);
			CURRENCY_TO_LOCALE_MAP.put("EUR", Locale.FRANCE);
		} catch (Exception e) {
			logger.error(null, e);
		}
	}

	/**
	 * Returns an instance of this class
	 * @return an instance
	 */
	public static CurrencyUtils getInstance() {
		if (instance == null) {
			instance = new CurrencyUtils();
		}
		return instance;
	}

	/**
	 * Formats a price for its specific locale, depending on the currency code
	 * @param price the amount
	 * @param cur the 3-letter currency code
	 * @return a formatted price with its currency symbol
	 */
	public String formatPrice(Double price, String cur) {
		String formatted = "";
		if (price != null) {
			Locale locale = CURRENCY_TO_LOCALE_MAP.get(cur);
			NumberFormat f = (locale == null) ? NumberFormat.getCurrencyInstance(Locale.US) :
					NumberFormat.getCurrencyInstance(locale);
			f.setMinimumFractionDigits(2);
			formatted = f.format(price);
		}
		return formatted;
	}

	/**
	 * Returns the full name of the currency in the language of the given locale.
	 * Defaults to English.
	 * @param cur the 3-letter currency code
	 * @param locale the locale
	 * @return the currency name or "" if the currency is unknown
	 */
	public String getCurrencyName(String cur, Locale locale) {
		if (cur != null && CURRENCY_TO_LOCALE_MAP.containsKey(cur.toUpperCase())) {
			return Currency.getInstance(cur.toUpperCase()).getDisplayName((locale == null ? Locale.US : locale));
		} else {
			return "";
		}
	}

	/**
	 * Returns the locale for a given country code.
	 * @param countryCode the 2-letter country code
	 * @return a locale or null if countryCode is null
	 */
	public Locale getLocaleForCountry(String countryCode) {
		if (countryCode == null) {
			return null;
		}
		return COUNTRY_TO_LOCALE_MAP.get(countryCode.toUpperCase());
	}

	/**
	 * Returns the currency instance for a given currency code
	 * @param cur the 3-letter currency code
	 * @return the currency
	 */
	public Currency getCurrency(String cur) {
		Currency currency = Currency.getInstance("EUR");
		if (StringUtils.isBlank(cur) || cur.length() != 3) {
			return currency;
		}
		try {
			currency = Currency.getInstance(cur.toUpperCase());
		} catch (Exception e) {
			logger.error(null, e);
		}
		return currency;
	}

	/**
	 * Returns a map of all available currencies in the form:
	 * currency code - full currency name and symbol
	 * @return a map of known currencies
	 */
	public Map getCurrenciesMap() {
		return CURRENCIES_MAP;
	}

	/**
	 * Validate the currency code.
	 * @param cur a 3-letter curency code
	 * @return true if the code corresponds to a valid currency
	 */
	public boolean isValidCurrency(String cur) {
		return cur != null && CURRENCIES_MAP.containsKey(cur.toUpperCase());
	}
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy