1 // 2016 and later: Unicode, Inc. and others. 2 // License & terms of use: http://www.unicode.org/copyright.html#License 3 /* 4 ******************************************************************************* 5 * Copyright (C) 2009-2016, International Business Machines Corporation and 6 * others. All Rights Reserved. 7 ******************************************************************************* 8 */ 9 package com.ibm.icu.impl; 10 11 import java.util.Collections; 12 import java.util.Map; 13 14 import com.ibm.icu.text.CurrencyDisplayNames; 15 import com.ibm.icu.text.DecimalFormatSymbols; 16 import com.ibm.icu.util.ULocale; 17 18 public class CurrencyData { 19 public static final CurrencyDisplayInfoProvider provider; 20 21 private CurrencyData() {} 22 23 public static interface CurrencyDisplayInfoProvider { 24 CurrencyDisplayInfo getInstance(ULocale locale, boolean withFallback); 25 boolean hasData(); 26 } 27 28 public static abstract class CurrencyDisplayInfo extends CurrencyDisplayNames { 29 public abstract Map<String, String> getUnitPatterns(); 30 public abstract CurrencyFormatInfo getFormatInfo(String isoCode); 31 public abstract CurrencySpacingInfo getSpacingInfo(); 32 } 33 34 public static final class CurrencyFormatInfo { 35 public final String currencyPattern; 36 public final String monetarySeparator; 37 public final String monetaryGroupingSeparator; 38 39 public CurrencyFormatInfo(String currencyPattern, String monetarySeparator, 40 String monetaryGroupingSeparator) { 41 this.currencyPattern = currencyPattern; 42 this.monetarySeparator = monetarySeparator; 43 this.monetaryGroupingSeparator = monetaryGroupingSeparator; 44 } 45 } 46 47 public static final class CurrencySpacingInfo { 48 private final String[][] symbols = new String[SpacingType.COUNT.ordinal()][SpacingPattern.COUNT.ordinal()]; 49 50 public static enum SpacingType { BEFORE, AFTER, COUNT }; 51 public static enum SpacingPattern { 52 CURRENCY_MATCH(DecimalFormatSymbols.CURRENCY_SPC_CURRENCY_MATCH), 53 SURROUNDING_MATCH(DecimalFormatSymbols.CURRENCY_SPC_SURROUNDING_MATCH), 54 INSERT_BETWEEN(DecimalFormatSymbols.CURRENCY_SPC_INSERT), 55 COUNT; 56 57 SpacingPattern() {} 58 SpacingPattern(int value) { assert value == ordinal(); } 59 }; 60 61 public CurrencySpacingInfo() {} 62 63 public CurrencySpacingInfo(String... strings) { 64 assert strings.length == 6; 65 66 int k = 0; 67 for (int i=0; i<SpacingType.COUNT.ordinal(); i++) { 68 for (int j=0; j<SpacingPattern.COUNT.ordinal(); j++) { 69 symbols[i][j] = strings[k]; 70 k++; 71 } 72 } 73 } 74 75 public void setSymbolIfNull(SpacingType type, SpacingPattern pattern, String value) { 76 int i = type.ordinal(); 77 int j = pattern.ordinal(); 78 if (symbols[i][j] == null) { 79 symbols[i][j] = value; 80 } 81 } 82 83 public String[] getBeforeSymbols() { 84 return symbols[SpacingType.BEFORE.ordinal()]; 85 } 86 87 public String[] getAfterSymbols() { 88 return symbols[SpacingType.AFTER.ordinal()]; 89 } 90 91 private static final String DEFAULT_CUR_MATCH = "[:letter:]"; 92 private static final String DEFAULT_CTX_MATCH = "[:digit:]"; 93 private static final String DEFAULT_INSERT = " "; 94 95 public static final CurrencySpacingInfo DEFAULT = new CurrencySpacingInfo( 96 DEFAULT_CUR_MATCH, DEFAULT_CTX_MATCH, DEFAULT_INSERT, 97 DEFAULT_CUR_MATCH, DEFAULT_CTX_MATCH, DEFAULT_INSERT); 98 } 99 100 static { 101 CurrencyDisplayInfoProvider temp = null; 102 try { 103 Class<?> clzz = Class.forName("com.ibm.icu.impl.ICUCurrencyDisplayInfoProvider"); 104 temp = (CurrencyDisplayInfoProvider) clzz.newInstance(); 105 } catch (Throwable t) { 106 temp = new CurrencyDisplayInfoProvider() { 107 @Override 108 public CurrencyDisplayInfo getInstance(ULocale locale, boolean withFallback) { 109 return DefaultInfo.getWithFallback(withFallback); 110 } 111 112 @Override 113 public boolean hasData() { 114 return false; 115 } 116 }; 117 } 118 provider = temp; 119 } 120 121 public static class DefaultInfo extends CurrencyDisplayInfo { 122 private final boolean fallback; 123 124 private DefaultInfo(boolean fallback) { 125 this.fallback = fallback; 126 } 127 128 public static final CurrencyDisplayInfo getWithFallback(boolean fallback) { 129 return fallback ? FALLBACK_INSTANCE : NO_FALLBACK_INSTANCE; 130 } 131 132 @Override 133 public String getName(String isoCode) { 134 return fallback ? isoCode : null; 135 } 136 137 @Override 138 public String getPluralName(String isoCode, String pluralType) { 139 return fallback ? isoCode : null; 140 } 141 142 @Override 143 public String getSymbol(String isoCode) { 144 return fallback ? isoCode : null; 145 } 146 147 @Override 148 public Map<String, String> symbolMap() { 149 return Collections.emptyMap(); 150 } 151 152 @Override 153 public Map<String, String> nameMap() { 154 return Collections.emptyMap(); 155 } 156 157 @Override 158 public ULocale getULocale() { 159 return ULocale.ROOT; 160 } 161 162 @Override 163 public Map<String, String> getUnitPatterns() { 164 if (fallback) { 165 return Collections.emptyMap(); 166 } 167 return null; 168 } 169 170 @Override 171 public CurrencyFormatInfo getFormatInfo(String isoCode) { 172 return null; 173 } 174 175 @Override 176 public CurrencySpacingInfo getSpacingInfo() { 177 return fallback ? CurrencySpacingInfo.DEFAULT : null; 178 } 179 180 private static final CurrencyDisplayInfo FALLBACK_INSTANCE = new DefaultInfo(true); 181 private static final CurrencyDisplayInfo NO_FALLBACK_INSTANCE = new DefaultInfo(false); 182 } 183 } 184