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