• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 package org.unicode.cldr.test;
2 
3 import java.util.HashMap;
4 import java.util.Iterator;
5 import java.util.Locale;
6 import java.util.Map;
7 import java.util.Set;
8 import java.util.TreeMap;
9 import java.util.regex.Pattern;
10 
11 import org.unicode.cldr.util.CLDRFile;
12 import org.unicode.cldr.util.ICUServiceBuilder;
13 import org.unicode.cldr.util.PatternCache;
14 import org.unicode.cldr.util.SupplementalDataInfo;
15 import org.unicode.cldr.util.XPathParts;
16 
17 import com.ibm.icu.impl.number.DecimalFormatProperties;
18 import com.ibm.icu.text.CompactDecimalFormat;
19 import com.ibm.icu.text.CompactDecimalFormat.CompactStyle;
20 import com.ibm.icu.text.DecimalFormat.PropertySetter;
21 import com.ibm.icu.util.Currency;
22 import com.ibm.icu.util.ULocale;
23 
24 @SuppressWarnings("deprecation")
25 public class BuildIcuCompactDecimalFormat {
26     static SupplementalDataInfo sdi = SupplementalDataInfo.getInstance();
27     static final int MINIMUM_ARRAY_LENGTH = 15;
28     static final Pattern PATTERN = PatternCache.get("([^0,]*)([0]+)([.]0+)?([^0]*)");
29     static final Pattern TYPE = PatternCache.get("1([0]*)");
30 
31     public enum CurrencyStyle {
32         PLAIN, CURRENCY, LONG_CURRENCY, ISO_CURRENCY, UNIT
33     }
34 
35     /**
36      * JUST FOR DEVELOPMENT
37      *
38      * @param currencyStyle
39      * @param currencyCode
40      */
build(CLDRFile resolvedCldrFile, Set<String> debugCreationErrors, String[] debugOriginals, CompactStyle style, ULocale locale, CurrencyStyle currencyStyle, String currencyCodeOrUnit)41     public static final CompactDecimalFormat build(CLDRFile resolvedCldrFile,
42         Set<String> debugCreationErrors, String[] debugOriginals,
43         CompactStyle style, ULocale locale, CurrencyStyle currencyStyle, String currencyCodeOrUnit) {
44 
45         final Map<String, Map<String, String>> customData = buildCustomData(resolvedCldrFile, style, currencyStyle);
46         CompactDecimalFormat cdf = CompactDecimalFormat.getInstance(locale, style);
47         ICUServiceBuilder builder = new ICUServiceBuilder().setCldrFile(resolvedCldrFile);
48 
49         cdf.setDecimalFormatSymbols(builder.getDecimalFormatSymbols("latn"));
50         cdf.setProperties(new PropertySetter() {
51             @Override
52             public void set(DecimalFormatProperties props) {
53                 props.setCompactCustomData(customData);
54             }
55         });
56         return cdf;
57     }
58 
buildCustomData(CLDRFile resolvedCldrFile, CompactStyle style, CurrencyStyle currencyStyle)59     public static Map<String, Map<String, String>> buildCustomData(CLDRFile resolvedCldrFile, CompactStyle style, CurrencyStyle currencyStyle) {
60 
61         final Map<String, Map<String, String>> customData = new TreeMap<>();
62 
63         String prefix = currencyStyle == CurrencyStyle.PLAIN ? "//ldml/numbers/decimalFormats[@numberSystem=\"latn\"]/decimalFormatLength"
64             : "//ldml/numbers/currencyFormats[@numberSystem=\"latn\"]/currencyFormatLength";
65 
66         Iterator<String> it = resolvedCldrFile.iterator(prefix);
67 
68         String styleString = style.toString().toLowerCase(Locale.ENGLISH);
69         while (it.hasNext()) {
70             String path = it.next();
71             if (path.endsWith("/alias")) {
72                 continue;
73             }
74             XPathParts parts = XPathParts.getFrozenInstance(path);
75             String stype = parts.getAttributeValue(3, "type");
76             if (!styleString.equals(stype)) {
77                 continue;
78             }
79             String type = parts.getAttributeValue(-1, "type");
80             String key = parts.getAttributeValue(-1, "count");
81             String pattern = resolvedCldrFile.getStringValue(path);
82             if (pattern.contentEquals("0")) {
83                 continue;
84             }
85 
86             /*
87                     <pattern type="1000" count="one">0K</pattern>
88              */
89 
90             add(customData, type, key, pattern);
91         }
92         return customData;
93     }
94 
add(Map<A, Map<B, C>> customData, A a, B b, C c)95     private static <A, B, C> void add(Map<A, Map<B, C>> customData, A a, B b, C c) {
96         Map<B, C> inner = customData.get(a);
97         if (inner == null) {
98             customData.put(a, inner = new HashMap<>());
99         }
100         inner.put(b, c);
101     }
102 
103     static class MyCurrencySymbolDisplay {
104         CLDRFile cldrFile;
105 
MyCurrencySymbolDisplay(CLDRFile cldrFile)106         public MyCurrencySymbolDisplay(CLDRFile cldrFile) {
107             this.cldrFile = cldrFile;
108         }
109 
getName(Currency currency, int count)110         public String getName(Currency currency, int count) {
111             final String currencyCode = currency.getCurrencyCode();
112             if (count > 1) {
113                 return currencyCode;
114             }
115             String prefix = "//ldml/numbers/currencies/currency[@type=\"" + currencyCode + "\"]/";
116             String currencySymbol = cldrFile.getWinningValue(prefix + "symbol");
117             return currencySymbol != null ? currencySymbol : currencyCode;
118         }
119     }
120 
121 }
122