Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
package com.hyperwallet.android.ui.common.util;

import static com.hyperwallet.android.model.transfer.Transfer.EMPTY_STRING;

import android.content.Context;

import androidx.annotation.VisibleForTesting;
Expand All @@ -18,17 +16,21 @@
import java.text.NumberFormat;
import java.util.ArrayList;
import java.util.Currency;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;

public class CurrencyParser {
private static CurrencyParser instance;
private static final String CURRENCY_LIST = "currency.json";
private List<CurrencyDetails> currencyList;
private final List<CurrencyDetails> currencyList;
private final HashMap<String, LocaleDetails> localeList = new HashMap<>();
private static final String REGEX_REMOVE_EMPTY_SPACE = "^\\s+|\\s+$";


private CurrencyParser(Context context) {
currencyList = populateCurrencyList(readJSONFromAsset(context));
setLocaleList();
}

public static CurrencyParser getInstance(Context context) {
Expand Down Expand Up @@ -74,21 +76,6 @@ private List<CurrencyDetails> populateCurrencyList(String currencyList) {
return mCurrencyDetailsList;
}

/**
* Formats the currency as per currency code.
*
* @param currency Any currency symbol.
* @param amount Any valid number in decimal.
* @return Returns the formatted number as per currency.
*/
public String formatCurrency(String currency, String amount) {
int numberOfFractions = getNumberOfFractionDigits(currency);
NumberFormat format = NumberFormat.getCurrencyInstance();
format.setMinimumFractionDigits(numberOfFractions);
format.setCurrency(Currency.getInstance(currency));
return format.format(Double.parseDouble(amount));
}

@VisibleForTesting
int getNumberOfFractionDigits(String currencyCode) {
for (CurrencyDetails list : currencyList) {
Expand All @@ -109,15 +96,21 @@ int getNumberOfFractionDigits(String currencyCode) {
*/

public String formatCurrencyWithSymbol(String currency, String amount) {
DecimalFormat currencyFormatter = (DecimalFormat) DecimalFormat.getCurrencyInstance();
DecimalFormat currencyFormatter;
if(localeList.containsKey(currency)) {
LocaleDetails locale = localeList.get(currency);
currencyFormatter = (DecimalFormat) DecimalFormat.getCurrencyInstance((new Locale(locale.getLanguage(),locale.getCountryCode())));
}else {
currencyFormatter = (DecimalFormat) DecimalFormat.getCurrencyInstance();
}
CurrencyDetails currencyDetails = getCurrency(currency);
currencyFormatter.setMinimumFractionDigits(currencyDetails == null ? 0 : currencyDetails.getDecimals());
currencyFormatter.setCurrency(Currency.getInstance(currency));
DecimalFormatSymbols decimalFormatSymbols = currencyFormatter.getDecimalFormatSymbols();
decimalFormatSymbols.setCurrencySymbol("");
currencyFormatter.setDecimalFormatSymbols(decimalFormatSymbols);
String formattedAmount = currencyFormatter.format(Double.parseDouble(amount)).replaceAll(REGEX_REMOVE_EMPTY_SPACE, EMPTY_STRING);
return currencyDetails == null ? "" : currencyDetails.getSymbol() + formattedAmount;
String formattedAmount = currencyFormatter.format(Double.parseDouble(amount));
return currencyDetails == null ? "" : currencyDetails.getSymbol() + formattedAmount.trim();
}

public CurrencyDetails getCurrency(String currencyCode) {
Expand All @@ -129,6 +122,105 @@ public CurrencyDetails getCurrency(String currencyCode) {
return null;
}

/**
*
*/
public void setLocaleList() {
localeList.clear();
localeList.put("AED",new LocaleDetails("en","AE"));
localeList.put("ALL",new LocaleDetails("en","US"));
localeList.put("AMD",new LocaleDetails("hy","AM"));
localeList.put("ARS",new LocaleDetails("es","AR"));
localeList.put("AUD",new LocaleDetails("en","AU"));
localeList.put("BAM",new LocaleDetails("hr","BA"));
localeList.put("BDT",new LocaleDetails("en","BD"));
localeList.put("BGN",new LocaleDetails("bg","BG"));
localeList.put("BHD",new LocaleDetails("en","US"));
localeList.put("BOB",new LocaleDetails("qu","BO"));
localeList.put("BRL",new LocaleDetails("en","BR"));
localeList.put("BWP",new LocaleDetails("en","BW"));
localeList.put("CAD",new LocaleDetails("en","CA"));
localeList.put("CHF",new LocaleDetails("en","CH"));
localeList.put("CLP",new LocaleDetails("es","CL"));
localeList.put("CNH",new LocaleDetails("en","CN"));
localeList.put("CNY",new LocaleDetails("en","CN"));
localeList.put("COP",new LocaleDetails("es","CO"));
localeList.put("CZK",new LocaleDetails("cs","CZ"));
localeList.put("DKK",new LocaleDetails("en","DK"));
localeList.put("EEK",new LocaleDetails("en","US"));
localeList.put("EGP",new LocaleDetails("en","US"));
localeList.put("ETB",new LocaleDetails("so","ET"));
localeList.put("EUR",new LocaleDetails("es","EA"));
localeList.put("FJD",new LocaleDetails("en","FJ"));
localeList.put("GBP",new LocaleDetails("kw","GB"));
localeList.put("GHS",new LocaleDetails("ee","GH"));
localeList.put("GMD",new LocaleDetails("en","GM"));
localeList.put("HKD",new LocaleDetails("en","HK"));
localeList.put("HRK",new LocaleDetails("es","HR"));
localeList.put("HUF",new LocaleDetails("hu","HU"));
localeList.put("IDR",new LocaleDetails("jv","ID"));
localeList.put("ILS",new LocaleDetails("he","IL"));
localeList.put("INR",new LocaleDetails("en","IN"));
localeList.put("ISK",new LocaleDetails("en","US"));
localeList.put("JMD",new LocaleDetails("en","JM"));
localeList.put("JOD",new LocaleDetails("en","us"));
localeList.put("JPY",new LocaleDetails("en","JP"));
localeList.put("KES",new LocaleDetails("guz","KE"));
localeList.put("KHR",new LocaleDetails("km","KH"));
localeList.put("KRW",new LocaleDetails("en","KR"));
localeList.put("KWD",new LocaleDetails("en","US"));
localeList.put("KZT",new LocaleDetails("ru","KZ"));
localeList.put("LAK",new LocaleDetails("lo","LA"));
localeList.put("LKR",new LocaleDetails("ta","LK"));
localeList.put("LSL",new LocaleDetails("en","US"));
localeList.put("MAD",new LocaleDetails("zgh","MA"));
localeList.put("MGA",new LocaleDetails("en","MG"));
localeList.put("MRU",new LocaleDetails("ff","MR"));
localeList.put("MUR",new LocaleDetails("en","MU"));
localeList.put("MWK",new LocaleDetails("en","MW"));
localeList.put("MXN",new LocaleDetails("en","MX"));
localeList.put("MYR",new LocaleDetails("en","MY"));
localeList.put("MZN",new LocaleDetails("mgh","MZ"));
localeList.put("NAD",new LocaleDetails("af","NA"));
localeList.put("NGN",new LocaleDetails("en","NG"));
localeList.put("NOK",new LocaleDetails("nn","NO"));
localeList.put("NPR",new LocaleDetails("en","US"));
localeList.put("NZD",new LocaleDetails("en","PN"));
localeList.put("OMR",new LocaleDetails("ae","OM"));
localeList.put("PEN",new LocaleDetails("en","PE"));
localeList.put("PGK",new LocaleDetails("en","PG"));
localeList.put("PHP",new LocaleDetails("ceb","PH"));
localeList.put("PKR",new LocaleDetails("en","PK"));
localeList.put("PLN",new LocaleDetails("pl","PL"));
localeList.put("QAR",new LocaleDetails("en","US"));
localeList.put("RON",new LocaleDetails("ro","RO"));
localeList.put("RSD",new LocaleDetails("sr","Latn_RS"));
localeList.put("RUB",new LocaleDetails("ru","RU"));
localeList.put("SBD",new LocaleDetails("en","SB"));
localeList.put("SEK",new LocaleDetails("en","SE"));
localeList.put("SGD",new LocaleDetails("ta","SG"));
localeList.put("SVG",new LocaleDetails("en","US"));
localeList.put("SZL",new LocaleDetails("en","SZ"));
localeList.put("THB",new LocaleDetails("th","TH"));
localeList.put("TND",new LocaleDetails("en","TN"));
localeList.put("TOP",new LocaleDetails("to","TO"));
localeList.put("TRY",new LocaleDetails("tr","TR"));
localeList.put("TWD",new LocaleDetails("zh","TW"));
localeList.put("UGX",new LocaleDetails("cgg","UG"));
localeList.put("USD",new LocaleDetails("es","US"));
localeList.put("UYU",new LocaleDetails("es","UY"));
localeList.put("VND",new LocaleDetails("vi","VN"));
localeList.put("VUV",new LocaleDetails("en","VU"));
localeList.put("WST",new LocaleDetails("en","WS"));
localeList.put("XPF",new LocaleDetails("fr","PF"));
localeList.put("ZAR",new LocaleDetails("en","ZA"));
localeList.put("ZMW",new LocaleDetails("en","ZM"));
}

public HashMap<String, LocaleDetails> getLocaleList()
{
return localeList;
}
/**
* truncate decimals for given value
*
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package com.hyperwallet.android.ui.common.util;

public class LocaleDetails {
private String language;
private String countryCode;

public LocaleDetails(String language, String countryCode) {
this.language = language;
this.countryCode = countryCode;
}

public String getLanguage() {
return language;
}

public String getCountryCode() {
return countryCode;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -20,62 +20,62 @@
public class CurrencyParserTest {
private Map<String, String> currenciesMap = new HashMap<String, String>() {
{
put("ALL", "ALL1,000,000.00"); // Albania Currency
put("ARS", "ARS1,000,000.00"); // Argentina Currency
put("AMD", "AMD1,000,000.00"); // Armenia Currency
put("AUD", "AUD1,000,000.00"); // Australia Currency
put("BDT", "BDT1,000,000.00"); // Bangladesh Currency
put("BRL", "BRL1,000,000.00"); // Brazil Currency
put("BGN", "BGN1,000,000.00"); // Bulgaria Currency
put("KHR", "KHR1,000,000.00"); // Cambodia Currency
put("CAD", "CAD1,000,000.00"); // Canada Currency
put("CLP", "CLP1,000,000"); // Chile Currency
put("CNY", "CNY1,000,000.00"); // China Currency
put("COP", "COP1,000,000.00"); // Colombia Currency
put("HRK", "HRK1,000,000.00"); // Croatia Currency
put("CZK", "CZK1,000,000.00"); // Czech Republic Currency
put("DKK", "DKK1,000,000.00"); // Denmark Currency
put("EGP", "EGP1,000,000.00"); // Egypt Currency
put("EUR", "EUR1,000,000.00"); // Austria Currency
put("HKD", "HKD1,000,000.00"); // Hong Kong Currency
put("HUF", "HUF1,000,000.00"); // Hungary Currency
put("INR", "INR1,000,000.00"); // India Currency
put("IDR", "IDR1,000,000"); // Indonesia Currency
put("JMD", "JMD1,000,000.00"); // Jamaica Currency
put("JPY", "JPY1,000,000"); // Japan Currency
put("JOD", "JOD1,000,000.00"); // Jordan Currency
put("KZT", "KZT1,000,000.00"); // Kazakhstan Currency
put("KES", "KES1,000,000.00"); // Kenya Currency
put("LAK", "LAK1,000,000.00"); // Laos Currency
put("MYR", "MYR1,000,000.00"); // Malaysia Currency
put("MXN", "MXN1,000,000.00"); // Mexico Currency
put("MAD", "MAD1,000,000.00"); // Morocco Currency
put("ILS", "ILS1,000,000.00"); // Israel Currency
put("TWD", "TWD1,000,000"); // Taiwan Currency
put("TRY", "TRY1,000,000.00"); // Turkey Currency
put("NZD", "NZD1,000,000.00"); // New Zealand Currency
put("NGN", "NGN1,000,000.00"); // Nigeria Currency
put("NOK", "NOK1,000,000.00"); // Norway Currency
put("PKR", "PKR1,000,000.00"); // Pakistan Currency
put("PEN", "PEN1,000,000.00"); // Peru Currency
put("PHP", "PHP1,000,000.00"); // Philippines Currency
put("PLN", "PLN1,000,000.00"); // Poland Currency
put("GBP", "GBP1,000,000.00"); // Isle of Man
put("RON", "RON1,000,000.00"); // Romania Currency
put("RUB", "RUB1,000,000.00"); // Russia Currency
put("RSD", "RSD1,000,000.00"); // Serbia Currency
put("SGD", "SGD1,000,000.00"); // Singapore Currency
put("ZAR", "ZAR1,000,000.00"); // South Africa Currency
put("KRW", "KRW1,000,000"); // South Korea Currency
put("LKR", "LKR1,000,000.00"); // Sri Lanka Currency
put("SEK", "SEK1,000,000.00"); // Sweden Currency
put("CHF", "CHF1,000,000.00"); // Switzerland Currency
put("THB", "THB1,000,000.00"); // Thailand Currency
put("TND", "TND1,000,000.000"); // Tunisia Currency
put("AED", "AED1,000,000.00"); // United Arab Emirates Currency
put("UGX", "UGX1,000,000"); // Uganda Currency
put("ALL", "L1,000,000.00"); // Albania Currency
put("ARS", "$1.000.000,00"); // Argentina Currency
put("AMD", "֏1,000,000.00"); // Armenia Currency
put("AUD", "A$1,000,000.00"); // Australia Currency
put("BDT", "Tk1,000,000.00"); // Bangladesh Currency
put("BRL", "R$1,000,000.00"); // Brazil Currency
put("BGN", "лв.1 000 000,00"); // Bulgaria Currency
put("KHR", "៛1,000,000.00"); // Cambodia Currency
put("CAD", "$1,000,000.00"); // Canada Currency
put("CLP", "$1.000.000"); // Chile Currency
put("CNY", "¥1,000,000.00"); // China Currency
put("COP", "$1.000.000,00"); // Colombia Currency
put("HRK", "kn1.000.000,00"); // Croatia Currency
put("CZK", "Kč1 000 000,00"); // Czech Republic Currency
put("DKK", "kr1,000,000.00"); // Denmark Currency
put("EGP", "E£1,000,000.00"); // Egypt Currency
put("EUR", "€1.000.000,00"); // Austria Currency
put("HKD", "HK$1,000,000.00"); // Hong Kong Currency
put("HUF", "Ft1 000 000,00"); // Hungary Currency
put("INR", "₹1,000,000.00"); // India Currency
put("IDR", "rp1,000,000"); // Indonesia Currency
put("JMD", "$1,000,000.00"); // Jamaica Currency
put("JPY", "¥1,000,000"); // Japan Currency
put("JOD", "د.ا1,000,000.00"); // Jordan Currency
put("KZT", "₸1 000 000,00"); // Kazakhstan Currency
put("KES", "KSh1,000,000.00"); // Kenya Currency
put("LAK", "₭1,000,000.00"); // Laos Currency
put("MYR", "RM1,000,000.00"); // Malaysia Currency
put("MXN", "$1,000,000.00"); // Mexico Currency
put("MAD", "د.م.1,000,000.00"); // Morocco Currency
put("ILS", "₪1,000,000.00"); // Israel Currency
put("TWD", "NT$1,000,000"); // Taiwan Currency
put("TRY", "TL1.000.000,00"); // Turkey Currency
put("NZD", "NZ$1,000,000.00"); // New Zealand Currency
put("NGN", "₦1,000,000.00"); // Nigeria Currency
put("NOK", "kr1 000 000,00"); // Norway Currency
put("PKR", "Rs1,000,000.00"); // Pakistan Currency
put("PEN", "S/.1,000,000.00"); // Peru Currency
put("PHP", "₱1,000,000.00"); // Philippines Currency
put("PLN", "zł1 000 000,00"); // Poland Currency
put("GBP", "£1,000,000.00"); // Isle of Man
put("RON", "lei1.000.000,00"); // Romania Currency
put("RUB", "руб1 000 000,00"); // Russia Currency
put("RSD", "Дин.1.000.000,00"); // Serbia Currency
put("SGD", "S$1,000,000.00"); // Singapore Currency
put("ZAR", "R1,000,000.00"); // South Africa Currency
put("KRW", "₩1,000,000"); // South Korea Currency
put("LKR", "රු1,000,000.00"); // Sri Lanka Currency
put("SEK", "kr1,000,000.00"); // Sweden Currency
put("CHF", "1,000,000.00"); // Switzerland Currency
put("THB", "฿1,000,000.00"); // Thailand Currency
put("TND", "د.ت1,000,000.000"); // Tunisia Currency
put("AED", "د.إ1,000,000.00"); // United Arab Emirates Currency
put("UGX", "USh1,000,000"); // Uganda Currency
put("USD", "$1,000,000.00"); // United States Currency
put("VND", "VND1,000,000.00"); // Vietnam Currency
put("VND", "₫1.000.000,00"); // Vietnam Currency
}
};

Expand All @@ -85,7 +85,7 @@ public void testAllCurrencyFormats() {

for (Map.Entry<String, String> currencyMap : currenciesMap.entrySet()) {
Context context = ApplicationProvider.getApplicationContext();
String currency = CurrencyParser.getInstance(context).formatCurrency(currencyMap.getKey(), amount);
String currency = CurrencyParser.getInstance(context).formatCurrencyWithSymbol(currencyMap.getKey(), amount);
assertThat(currency, is(currencyMap.getValue()));
}
}
Expand Down
Loading