17935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert/* 27935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ******************************************************************************* 37935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Copyright (C) 2009-2014, International Business Machines Corporation and * 47935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * others. All Rights Reserved. * 57935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert ******************************************************************************* 67935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 77935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertpackage com.ibm.icu.text; 87935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 97935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.lang.reflect.Field; 107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.util.Collections; 117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.util.Date; 127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.util.List; 137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.impl.Grego; 157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.util.Currency.CurrencyUsage; 167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert/** 187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Provides information about currencies that is not specific to a locale. 197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * 207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * A note about currency dates. The CLDR data provides data to the day, 217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * inclusive. The date information used by CurrencyInfo and CurrencyFilter 227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * is represented by milliseconds, which is overly precise. These times are 237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * in GMT, so queries involving dates should use GMT times, but more generally 247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * you should avoid relying on time of day in queries. 257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * 267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * This class is not intended for public subclassing. 277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * 287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @stable ICU 4.4 297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertpublic class CurrencyMetaInfo { 317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert private static final CurrencyMetaInfo impl; 327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert private static final boolean hasData; 337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Returns the unique instance of the currency meta info. 367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @return the meta info 377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @stable ICU 4.4 387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public static CurrencyMetaInfo getInstance() { 407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return impl; 417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Returns the unique instance of the currency meta info, or null if 457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * noSubstitute is true and there is no data to support this API. 467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @param noSubstitute true if no substitute data should be used 477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @return the meta info, or null 487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @stable ICU 49 497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public static CurrencyMetaInfo getInstance(boolean noSubstitute) { 517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return hasData ? impl : null; 527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Returns true if there is data for the currency meta info. 567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @return true if there is actual data 577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @internal 587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @deprecated This API is ICU internal only. 597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert @Deprecated 617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public static boolean hasData() { 627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return hasData; 637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Subclass constructor. 677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @internal 687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @deprecated This API is ICU internal only. 697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert @Deprecated 717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert protected CurrencyMetaInfo() { 727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * A filter used to select which currency info is returned. 767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @stable ICU 4.4 777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public static final class CurrencyFilter { 797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * The region to filter on. If null, accepts any region. 817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @stable ICU 4.4 827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public final String region; 847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * The currency to filter on. If null, accepts any currency. 877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @stable ICU 4.4 887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public final String currency; 907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * The from date to filter on (as milliseconds). Accepts any currency on or after this date. 937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @stable ICU 4.4 947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public final long from; 967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * The to date to filter on (as milliseconds). Accepts any currency on or before this date. 997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @stable ICU 4.4 1007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 1017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public final long to; 1027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 1037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 1047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * true if we are filtering only for currencies used as legal tender. 1057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @internal 1067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @deprecated This API is ICU internal only. 1077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 1087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert @Deprecated 1097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public final boolean tenderOnly; 1107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 1117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert private CurrencyFilter(String region, String currency, long from, long to, boolean tenderOnly) { 1127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert this.region = region; 1137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert this.currency = currency; 1147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert this.from = from; 1157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert this.to = to; 1167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert this.tenderOnly = tenderOnly; 1177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 1187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 1197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 1207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert private static final CurrencyFilter ALL = new CurrencyFilter( 1217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert null, null, Long.MIN_VALUE, Long.MAX_VALUE, false); 1227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 1237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 1247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Returns a filter that accepts all currency data. 1257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @return a filter 1267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @stable ICU 4.4 1277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 1287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public static CurrencyFilter all() { 1297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return ALL; 1307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 1317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 1327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 1337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Returns a filter that accepts all currencies in use as of the current date. 1347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @return a filter 1357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @see #withDate(Date) 1367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @stable ICU 4.4 1377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 1387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public static CurrencyFilter now() { 1397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return ALL.withDate(new Date()); 1407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 1417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 1427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 1437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Returns a filter that accepts all currencies ever used in the given region. 1447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @param region the region code 1457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @return a filter 1467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @see #withRegion(String) 1477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @stable ICU 4.4 1487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 1497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public static CurrencyFilter onRegion(String region) { 1507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return ALL.withRegion(region); 1517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 1527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 1537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 1547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Returns a filter that accepts the given currency. 1557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @param currency the currency code 1567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @return a filter 1577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @see #withCurrency(String) 1587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @stable ICU 4.4 1597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 1607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public static CurrencyFilter onCurrency(String currency) { 1617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return ALL.withCurrency(currency); 1627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 1637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 1647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 1657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Returns a filter that accepts all currencies in use on the given date. 1667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @param date the date 1677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @return a filter 1687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @see #withDate(Date) 1697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @stable ICU 4.4 1707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 1717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public static CurrencyFilter onDate(Date date) { 1727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return ALL.withDate(date); 1737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 1747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 1757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 1767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Returns a filter that accepts all currencies that were in use at some point between 1777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * the given dates, or if dates are equal, currencies in use on that date. 1787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @param from date on or after a currency must have been in use 1797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @param to date on or before which a currency must have been in use, 1807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * or if equal to from, the date on which a currency must have been in use 1817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @return a filter 1827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @see #withDateRange(Date, Date) 1837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @stable ICU 49 1847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 1857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public static CurrencyFilter onDateRange(Date from, Date to) { 1867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return ALL.withDateRange(from, to); 1877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 1887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 1897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 1907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Returns a filter that accepts all currencies in use on the given date. 1917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @param date the date as milliseconds after Jan 1, 1970 1927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @stable ICU 51 1937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 1947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public static CurrencyFilter onDate(long date) { 1957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return ALL.withDate(date); 1967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 1977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 1987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 1997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Returns a filter that accepts all currencies that were in use at some 2007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * point between the given dates, or if dates are equal, currencies in 2017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * use on that date. 2027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @param from The date on or after a currency must have been in use. 2037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Measured in milliseconds since Jan 1, 1970 GMT. 2047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @param to The date on or before which a currency must have been in use. 2057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Measured in milliseconds since Jan 1, 1970 GMT. 2067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @stable ICU 51 2077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 2087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public static CurrencyFilter onDateRange(long from, long to) { 2097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return ALL.withDateRange(from, to); 2107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 2117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 2127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 2137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Returns a CurrencyFilter for finding currencies that were either once used, 2147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * are used, or will be used as tender. 2157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @stable ICU 51 2167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 2177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public static CurrencyFilter onTender() { 2187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return ALL.withTender(); 2197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 2207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 2217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 2227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Returns a copy of this filter, with the specified region. Region can be null to 2237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * indicate no filter on region. 2247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @param region the region code 2257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @return the filter 2267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @see #onRegion(String) 2277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @stable ICU 4.4 2287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 2297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public CurrencyFilter withRegion(String region) { 2307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return new CurrencyFilter(region, this.currency, this.from, this.to, this.tenderOnly); 2317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 2327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 2337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 2347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Returns a copy of this filter, with the specified currency. Currency can be null to 2357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * indicate no filter on currency. 2367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @param currency the currency code 2377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @return the filter 2387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @see #onCurrency(String) 2397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @stable ICU 4.4 2407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 2417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public CurrencyFilter withCurrency(String currency) { 2427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return new CurrencyFilter(this.region, currency, this.from, this.to, this.tenderOnly); 2437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 2447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 2457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 2467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Returns a copy of this filter, with from and to set to the given date. 2477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @param date the date on which the currency must have been in use 2487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @return the filter 2497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @see #onDate(Date) 2507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @stable ICU 4.4 2517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 2527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public CurrencyFilter withDate(Date date) { 2537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return new CurrencyFilter(this.region, this.currency, date.getTime(), date.getTime(), this.tenderOnly); 2547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 2557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 2567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 2577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Returns a copy of this filter, with from and to set to the given dates. 2587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @param from date on or after which the currency must have been in use 2597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @param to date on or before which the currency must have been in use 2607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @return the filter 2617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @see #onDateRange(Date, Date) 2627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @stable ICU 49 2637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 2647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public CurrencyFilter withDateRange(Date from, Date to) { 2657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert long fromLong = from == null ? Long.MIN_VALUE : from.getTime(); 2667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert long toLong = to == null ? Long.MAX_VALUE : to.getTime(); 2677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return new CurrencyFilter(this.region, this.currency, fromLong, toLong, this.tenderOnly); 2687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 2697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 2707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 2717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Returns a copy of this filter that accepts all currencies in use on 2727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * the given date. 2737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @param date the date as milliseconds after Jan 1, 1970 2747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @stable ICU 51 2757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 2767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public CurrencyFilter withDate(long date) { 2777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return new CurrencyFilter(this.region, this.currency, date, date, this.tenderOnly); 2787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 2797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 2807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 2817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Returns a copy of this filter that accepts all currencies that were 2827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * in use at some point between the given dates, or if dates are equal, 2837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * currencies in use on that date. 2847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @param from The date on or after a currency must have been in use. 2857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Measured in milliseconds since Jan 1, 1970 GMT. 2867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @param to The date on or before which a currency must have been in use. 2877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Measured in milliseconds since Jan 1, 1970 GMT. 2887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @stable ICU 51 2897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 2907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public CurrencyFilter withDateRange(long from, long to) { 2917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return new CurrencyFilter(this.region, this.currency, from, to, this.tenderOnly); 2927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 2937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 2947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 2957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Returns a copy of this filter that filters for currencies that were 2967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * either once used, are used, or will be used as tender. 2977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @stable ICU 51 2987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 2997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public CurrencyFilter withTender() { 3007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return new CurrencyFilter(this.region, this.currency, this.from, this.to, true); 3017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 3027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 3037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 3047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * {@inheritDoc} 3057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @stable ICU 4.4 3067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 3077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert @Override 3087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public boolean equals(Object rhs) { 3097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return rhs instanceof CurrencyFilter && 3107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert equals((CurrencyFilter) rhs); 3117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 3127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 3137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 3147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Type-safe override of {@link #equals(Object)}. 3157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @param rhs the currency filter to compare to 3167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @return true if the filters are equal 3177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @stable ICU 4.4 3187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 3197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public boolean equals(CurrencyFilter rhs) { 3207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return this == rhs || (rhs != null && 3217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert equals(this.region, rhs.region) && 3227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert equals(this.currency, rhs.currency) && 3237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert this.from == rhs.from && 3247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert this.to == rhs.to && 3257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert this.tenderOnly == rhs.tenderOnly); 3267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 3277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 3287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 3297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * {@inheritDoc} 3307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @stable ICU 4.4 3317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 3327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert @Override 3337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public int hashCode() { 3347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert int hc = 0; 3357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (region != null) { 3367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert hc = region.hashCode(); 3377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 3387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (currency != null) { 3397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert hc = hc * 31 + currency.hashCode(); 3407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 3417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert hc = hc * 31 + (int) from; 3427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert hc = hc * 31 + (int) (from >>> 32); 3437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert hc = hc * 31 + (int) to; 3447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert hc = hc * 31 + (int) (to >>> 32); 3457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert hc = hc * 31 + (tenderOnly ? 1 : 0); 3467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return hc; 3477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 3487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 3497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 3507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Returns a string representing the filter, for debugging. 3517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @return A string representing the filter. 3527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @stable ICU 4.4 3537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 3547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert @Override 3557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public String toString() { 3567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return debugString(this); 3577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 3587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 3597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert private static boolean equals(String lhs, String rhs) { 3607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return lhs == rhs || (lhs != null && lhs.equals(rhs)); 3617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 3627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 3637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 3647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 3657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Represents the raw information about fraction digits and rounding increment. 3667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @stable ICU 4.4 3677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 3687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public static final class CurrencyDigits { 3697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 3707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Number of fraction digits used to display this currency. 3717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @stable ICU 49 3727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 3737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public final int fractionDigits; 3747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 3757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Rounding increment used when displaying this currency. 3767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @stable ICU 49 3777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 3787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public final int roundingIncrement; 3797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 3807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 3817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Constructor for CurrencyDigits. 3827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @param fractionDigits the fraction digits 3837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @param roundingIncrement the rounding increment 3847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @stable ICU 4.4 3857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 3867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public CurrencyDigits(int fractionDigits, int roundingIncrement) { 3877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert this.fractionDigits = fractionDigits; 3887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert this.roundingIncrement = roundingIncrement; 3897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 3907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 3917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 3927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Returns a string representing the currency digits, for debugging. 3937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @return A string representing the currency digits. 3947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @stable ICU 4.4 3957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 3967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert @Override 3977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public String toString() { 3987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return debugString(this); 3997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 4007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 4017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 4027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 4037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Represents a complete currency info record listing the region, currency, from and to dates, 4047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * and priority. 4057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Use {@link CurrencyMetaInfo#currencyInfo(CurrencyFilter)} 4067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * for a list of info objects matching the filter. 4077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @stable ICU 4.4 4087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 4097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public static final class CurrencyInfo { 4107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 4117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Region code where currency is used. 4127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @stable ICU 4.4 4137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 4147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public final String region; 4157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 4167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 4177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * The three-letter ISO currency code. 4187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @stable ICU 4.4 4197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 4207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public final String code; 4217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 4227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 4237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Date on which the currency was first officially used in the region. 4247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * This is midnight at the start of the first day on which the currency was used, GMT. 4257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * If there is no date, this is Long.MIN_VALUE; 4267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @stable ICU 4.4 4277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 4287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public final long from; 4297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 4307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 4317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Date at which the currency stopped being officially used in the region. 4327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * This is one millisecond before midnight at the end of the last day on which the currency was used, GMT. 4337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * If there is no date, this is Long.MAX_VALUE. 4347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * 4357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @stable ICU 4.4 4367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 4377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public final long to; 4387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 4397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 4407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Preference order of currencies being used at the same time in the region. Lower 4417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * values are preferred (generally, this is a transition from an older to a newer 4427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * currency). Priorities within a single country are unique. 4437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @stable ICU 49 4447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 4457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public final int priority; 4467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 4477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 4487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert private final boolean tender; 4497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 4507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 4517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @deprecated ICU 51 Use {@link CurrencyMetaInfo#currencyInfo(CurrencyFilter)} instead. 4527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 4537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert @Deprecated 4547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public CurrencyInfo(String region, String code, long from, long to, int priority) { 4557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert this(region, code, from, to, priority, true); 4567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 4577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 4587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 4597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Constructs a currency info. 4607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * 4617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @internal 4627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @deprecated This API is ICU internal only. 4637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 4647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert @Deprecated 4657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public CurrencyInfo(String region, String code, long from, long to, int priority, boolean tender) { 4667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert this.region = region; 4677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert this.code = code; 4687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert this.from = from; 4697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert this.to = to; 4707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert this.priority = priority; 4717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert this.tender = tender; 4727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 4737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 4747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 4757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Returns a string representation of this object, useful for debugging. 4767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @return A string representation of this object. 4777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @stable ICU 4.4 4787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 4797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert @Override 4807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public String toString() { 4817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return debugString(this); 4827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 4837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 4847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 4857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Determine whether or not this currency was once used, is used, 4867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * or will be used as tender in this region. 4877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @stable ICU 51 4887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 4897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public boolean isTender() { 4907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return tender; 4917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 4927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 4937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 4947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert///CLOVER:OFF 4957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 4967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Returns the list of CurrencyInfos matching the provided filter. Results 4977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * are ordered by country code, then by highest to lowest priority (0 is highest). 4987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * The returned list is unmodifiable. 4997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @param filter the filter to control which currency info to return 5007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @return the matching information 5017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @stable ICU 4.4 5027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 5037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public List<CurrencyInfo> currencyInfo(CurrencyFilter filter) { 5047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return Collections.emptyList(); 5057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 5067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 5077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 5087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Returns the list of currency codes matching the provided filter. 5097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Results are ordered as in {@link #currencyInfo(CurrencyFilter)}. 5107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * The returned list is unmodifiable. 5117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @param filter the filter to control which currencies to return. If filter is null, 5127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * returns all currencies for which information is available. 5137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @return the matching currency codes 5147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @stable ICU 4.4 5157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 5167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public List<String> currencies(CurrencyFilter filter) { 5177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return Collections.emptyList(); 5187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 5197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 5207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 5217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Returns the list of region codes matching the provided filter. 5227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Results are ordered as in {@link #currencyInfo(CurrencyFilter)}. 5237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * The returned list is unmodifiable. 5247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @param filter the filter to control which regions to return. If filter is null, 5257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * returns all regions for which information is available. 5267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @return the matching region codes 5277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @stable ICU 4.4 5287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 5297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public List<String> regions(CurrencyFilter filter) { 5307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return Collections.emptyList(); 5317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 5327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert///CLOVER:ON 5337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 5347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 5357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Returns the CurrencyDigits for the currency code. 5367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * This is equivalent to currencyDigits(isoCode, CurrencyUsage.STANDARD); 5377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @param isoCode the currency code 5387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @return the CurrencyDigits 5397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @stable ICU 4.4 5407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 5417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public CurrencyDigits currencyDigits(String isoCode) { 5427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return currencyDigits(isoCode, CurrencyUsage.STANDARD); 5437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 5447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 5457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 5467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Returns the CurrencyDigits for the currency code with Context Usage. 5477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @param isoCode the currency code 5487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @param currencyUsage the currency usage 5497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @return the CurrencyDigits 5507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @draft ICU 54 5517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @provisional This API might change or be removed in a future release. 5527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 5537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert public CurrencyDigits currencyDigits(String isoCode, CurrencyUsage currencyUsage) { 5547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return defaultDigits; 5557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 5567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 5577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert /** 5587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @internal 5597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * @deprecated This API is ICU internal only. 5607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */ 5617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert @Deprecated 5627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert protected static final CurrencyDigits defaultDigits = new CurrencyDigits(2, 0); 5637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 5647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert static { 5657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert CurrencyMetaInfo temp = null; 5667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert boolean tempHasData = false; 5677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert try { 5687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Class<?> clzz = Class.forName("com.ibm.icu.impl.ICUCurrencyMetaInfo"); 5697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert temp = (CurrencyMetaInfo) clzz.newInstance(); 5707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert tempHasData = true; 5717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } catch (Throwable t) { 5727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert temp = new CurrencyMetaInfo(); 5737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 5747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert impl = temp; 5757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert hasData = tempHasData; 5767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 5777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 5787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert private static String dateString(long date) { 5797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (date == Long.MAX_VALUE || date == Long.MIN_VALUE) { 5807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return null; 5817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 5827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return Grego.timeToString(date); 5837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 5847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert 5857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert private static String debugString(Object o) { 5867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert StringBuilder sb = new StringBuilder(); 5877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert try { 5887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert for (Field f : o.getClass().getFields()) { 5897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert Object v = f.get(o); 5907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (v != null) { 5917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert String s; 5927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (v instanceof Date) { 5937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert s = dateString(((Date)v).getTime()); 5947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } else if (v instanceof Long) { 5957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert s = dateString(((Long)v).longValue()); 5967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } else { 5977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert s = String.valueOf(v); 5987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 5997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (s == null) { 6007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert continue; 6017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 6027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert if (sb.length() > 0) { 6037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert sb.append(","); 6047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 6057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert sb.append(f.getName()) 6067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert .append("='") 6077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert .append(s) 6087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert .append("'"); 6097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 6107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 6117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } catch (Throwable t) { 6127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 6137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert sb.insert(0, o.getClass().getSimpleName() + "("); 6147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert sb.append(")"); 6157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert return sb.toString(); 6167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert } 6177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert} 618