package de.invesdwin.util.lang;
import java.nio.ByteBuffer;
import java.text.NumberFormat;
import java.util.Currency;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
import java.util.Map.Entry;
import javax.annotation.concurrent.Immutable;
import de.invesdwin.util.math.decimal.Decimal;
@Immutable
public final class Currencies {
public static final String CNY_SYMBOL = "元";
public static final String JPY_SYMBOL = "¥";
public static final String GBP_SYMBOL = "£";
public static final String EUR_SYMBOL = "€";
public static final String USD_SYMBOL = "$";
public static final Currency ARS = Currency.getInstance("ARS");
public static final Currency AUD = Currency.getInstance("AUD");
public static final Currency BGN = Currency.getInstance("BGN");
public static final Currency BRL = Currency.getInstance("BRL");
public static final Currency CAD = Currency.getInstance("CAD");
public static final Currency CHF = Currency.getInstance("CHF");
public static final Currency CNY = Currency.getInstance("CNY");
public static final Currency CZK = Currency.getInstance("CZK");
public static final Currency DKK = Currency.getInstance("DKK");
public static final Currency EUR = Currency.getInstance("EUR");
public static final Currency GBP = Currency.getInstance("GBP");
public static final Currency HKD = Currency.getInstance("HKD");
public static final Currency HUF = Currency.getInstance("HUF");
public static final Currency INR = Currency.getInstance("INR");
public static final Currency JPY = Currency.getInstance("JPY");
public static final Currency MXN = Currency.getInstance("MXN");
public static final Currency NOK = Currency.getInstance("NOK");
public static final Currency NZD = Currency.getInstance("NZD");
public static final Currency PLN = Currency.getInstance("PLN");
public static final Currency RON = Currency.getInstance("RON");
public static final Currency RUB = Currency.getInstance("RUB");
public static final Currency SAR = Currency.getInstance("SAR");
public static final Currency SEK = Currency.getInstance("SEK");
public static final Currency SGD = Currency.getInstance("SGD");
public static final Currency TRY = Currency.getInstance("TRY");
public static final Currency TWD = Currency.getInstance("TWD");
public static final Currency USD = Currency.getInstance("USD");
public static final Currency ZAR = Currency.getInstance("ZAR");
private static final Map<String, String> CURRENCY_CODE_2_CURRENCY_SYMBOL = new HashMap<String, String>();
static {
//only put commonly (internationally) known symbols here
CURRENCY_CODE_2_CURRENCY_SYMBOL.put("USD", USD_SYMBOL);
CURRENCY_CODE_2_CURRENCY_SYMBOL.put("EUR", EUR_SYMBOL);
CURRENCY_CODE_2_CURRENCY_SYMBOL.put("GBP", GBP_SYMBOL);
CURRENCY_CODE_2_CURRENCY_SYMBOL.put("JPY", JPY_SYMBOL);
CURRENCY_CODE_2_CURRENCY_SYMBOL.put("CNY", CNY_SYMBOL);
}
private Currencies() {}
/**
* This method uses symbols for the most common currencies.
*
* This results in: 1,212.12 € or 1,212.12 CNY
*
* The symbol is put behind the number with a space, to increase readability in tables.
*/
public static String formatMoney(final Locale locale, final String currencyCode, final Decimal price) {
final NumberFormat nf = NumberFormat.getNumberInstance(locale);
nf.setMinimumFractionDigits(2);
nf.setMaximumFractionDigits(2);
String str = nf.format(price);
str += " " + formatCurrencyCode(currencyCode);
return str;
}
public static String formatCurrencyCode(final String currencyCode) {
final String currencySymbol = CURRENCY_CODE_2_CURRENCY_SYMBOL.get(currencyCode);
if (currencySymbol != null) {
return currencySymbol;
} else {
return currencyCode;
}
}
public static String replaceCurrencySymbolsWithCurrencyCode(final String str) {
String replaced = str;
for (final Entry<String, String> entry : CURRENCY_CODE_2_CURRENCY_SYMBOL.entrySet()) {
final String code = entry.getKey();
final String symbol = entry.getValue();
replaced = replaced.replace(symbol, code);
}
return replaced;
}
public static Currency getInstance(final String currencyCode) {
try {
return Currency.getInstance(currencyCode);
} catch (final Throwable t) {
throw new RuntimeException("On: " + currencyCode, t);
}
}
public static Currency getInstanceOrNull(final String currencyCode) {
try {
return Currency.getInstance(currencyCode);
} catch (final Throwable t) {
return null;
}
}
public static void putCurrency(final ByteBuffer buffer, final Currency currency) {
if (currency == null) {
buffer.put("___".getBytes());
} else {
buffer.put(currency.getCurrencyCode().getBytes());
}
}
public static Currency extractCurrency(final ByteBuffer buffer, final int index) {
final byte[] bytes = new byte[3];
buffer.get(bytes);
final String currencyCode = new String(bytes);
if ("___".equals(currencyCode)) {
return null;
} else {
return getInstance(currencyCode);
}
}
}