12d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert// © 2016 and later: Unicode, Inc. and others. 22d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert// License & terms of use: http://www.unicode.org/copyright.html#License 37935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert/* 47935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ******************************************************************************* 52d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert * Copyright (C) 2009-2016, International Business Machines Corporation and 62d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert * others. All Rights Reserved. 77935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ******************************************************************************* 87935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 97935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertpackage com.ibm.icu.impl; 107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.util.Collections; 127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.util.Map; 137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.text.CurrencyDisplayNames; 15e19b4af0cca128ff8202ec008570423a1ed8a6fdFredrik Roubertimport com.ibm.icu.text.DecimalFormatSymbols; 167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.util.ULocale; 177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertpublic class CurrencyData { 197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public static final CurrencyDisplayInfoProvider provider; 207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 212d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert private CurrencyData() {} 222d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert 237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public static interface CurrencyDisplayInfoProvider { 247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert CurrencyDisplayInfo getInstance(ULocale locale, boolean withFallback); 257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert boolean hasData(); 267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public static abstract class CurrencyDisplayInfo extends CurrencyDisplayNames { 297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public abstract Map<String, String> getUnitPatterns(); 307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public abstract CurrencyFormatInfo getFormatInfo(String isoCode); 317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public abstract CurrencySpacingInfo getSpacingInfo(); 327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public static final class CurrencyFormatInfo { 357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public final String currencyPattern; 362d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert public final String monetarySeparator; 372d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert public final String monetaryGroupingSeparator; 387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 392d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert public CurrencyFormatInfo(String currencyPattern, String monetarySeparator, 402d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert String monetaryGroupingSeparator) { 417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert this.currencyPattern = currencyPattern; 427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert this.monetarySeparator = monetarySeparator; 437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert this.monetaryGroupingSeparator = monetaryGroupingSeparator; 447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public static final class CurrencySpacingInfo { 482d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert private final String[][] symbols = new String[SpacingType.COUNT.ordinal()][SpacingPattern.COUNT.ordinal()]; 492d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert 502d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert public static enum SpacingType { BEFORE, AFTER, COUNT }; 51e19b4af0cca128ff8202ec008570423a1ed8a6fdFredrik Roubert public static enum SpacingPattern { 52e19b4af0cca128ff8202ec008570423a1ed8a6fdFredrik Roubert CURRENCY_MATCH(DecimalFormatSymbols.CURRENCY_SPC_CURRENCY_MATCH), 53e19b4af0cca128ff8202ec008570423a1ed8a6fdFredrik Roubert SURROUNDING_MATCH(DecimalFormatSymbols.CURRENCY_SPC_SURROUNDING_MATCH), 54e19b4af0cca128ff8202ec008570423a1ed8a6fdFredrik Roubert INSERT_BETWEEN(DecimalFormatSymbols.CURRENCY_SPC_INSERT), 55e19b4af0cca128ff8202ec008570423a1ed8a6fdFredrik Roubert COUNT; 56e19b4af0cca128ff8202ec008570423a1ed8a6fdFredrik Roubert 57e19b4af0cca128ff8202ec008570423a1ed8a6fdFredrik Roubert SpacingPattern() {} 58e19b4af0cca128ff8202ec008570423a1ed8a6fdFredrik Roubert SpacingPattern(int value) { assert value == ordinal(); } 59e19b4af0cca128ff8202ec008570423a1ed8a6fdFredrik Roubert }; 602d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert 612d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert public CurrencySpacingInfo() {} 622d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert 632d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert public CurrencySpacingInfo(String... strings) { 642d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert assert strings.length == 6; 652d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert 662d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert int k = 0; 672d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert for (int i=0; i<SpacingType.COUNT.ordinal(); i++) { 682d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert for (int j=0; j<SpacingPattern.COUNT.ordinal(); j++) { 692d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert symbols[i][j] = strings[k]; 702d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert k++; 712d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert } 722d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert } 737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 752d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert public void setSymbolIfNull(SpacingType type, SpacingPattern pattern, String value) { 762d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert int i = type.ordinal(); 772d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert int j = pattern.ordinal(); 782d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert if (symbols[i][j] == null) { 792d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert symbols[i][j] = value; 802d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert } 812d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert } 822d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert 832d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert public String[] getBeforeSymbols() { 842d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert return symbols[SpacingType.BEFORE.ordinal()]; 852d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert } 862d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert 872d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert public String[] getAfterSymbols() { 882d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert return symbols[SpacingType.AFTER.ordinal()]; 892d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert } 907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert private static final String DEFAULT_CUR_MATCH = "[:letter:]"; 927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert private static final String DEFAULT_CTX_MATCH = "[:digit:]"; 937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert private static final String DEFAULT_INSERT = " "; 947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public static final CurrencySpacingInfo DEFAULT = new CurrencySpacingInfo( 967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DEFAULT_CUR_MATCH, DEFAULT_CTX_MATCH, DEFAULT_INSERT, 977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert DEFAULT_CUR_MATCH, DEFAULT_CTX_MATCH, DEFAULT_INSERT); 987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 1007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert static { 1017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert CurrencyDisplayInfoProvider temp = null; 1027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert try { 1037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Class<?> clzz = Class.forName("com.ibm.icu.impl.ICUCurrencyDisplayInfoProvider"); 1047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert temp = (CurrencyDisplayInfoProvider) clzz.newInstance(); 1057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } catch (Throwable t) { 1067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert temp = new CurrencyDisplayInfoProvider() { 1072d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert @Override 1087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public CurrencyDisplayInfo getInstance(ULocale locale, boolean withFallback) { 1097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return DefaultInfo.getWithFallback(withFallback); 1107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 1117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 1122d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert @Override 1137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public boolean hasData() { 1147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return false; 1157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 1167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert }; 1177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 1187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert provider = temp; 1197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 1207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 1217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public static class DefaultInfo extends CurrencyDisplayInfo { 1227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert private final boolean fallback; 1237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 1247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert private DefaultInfo(boolean fallback) { 1257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert this.fallback = fallback; 1267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 1277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 1287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public static final CurrencyDisplayInfo getWithFallback(boolean fallback) { 1297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return fallback ? FALLBACK_INSTANCE : NO_FALLBACK_INSTANCE; 1307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 1317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 1327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert @Override 1337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public String getName(String isoCode) { 1347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return fallback ? isoCode : null; 1357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 1367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 1377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert @Override 1387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public String getPluralName(String isoCode, String pluralType) { 1397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return fallback ? isoCode : null; 1407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 1417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 1427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert @Override 1437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public String getSymbol(String isoCode) { 1447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return fallback ? isoCode : null; 1457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 1467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 1477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert @Override 1487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public Map<String, String> symbolMap() { 1497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return Collections.emptyMap(); 1507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 1517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 1527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert @Override 1537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public Map<String, String> nameMap() { 1547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return Collections.emptyMap(); 1557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 1567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 1577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert @Override 1587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public ULocale getULocale() { 1597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return ULocale.ROOT; 1607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 1617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 1627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert @Override 1637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public Map<String, String> getUnitPatterns() { 1647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (fallback) { 1657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return Collections.emptyMap(); 1667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 1677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return null; 1687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 1697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 1707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert @Override 1717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public CurrencyFormatInfo getFormatInfo(String isoCode) { 1727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return null; 1737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 1747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 1757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert @Override 1767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public CurrencySpacingInfo getSpacingInfo() { 1777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return fallback ? CurrencySpacingInfo.DEFAULT : null; 1787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 1797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 1807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert private static final CurrencyDisplayInfo FALLBACK_INSTANCE = new DefaultInfo(true); 1817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert private static final CurrencyDisplayInfo NO_FALLBACK_INSTANCE = new DefaultInfo(false); 1827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 1837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert} 184