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