17935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert/*
27935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert *******************************************************************************
37935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Copyright (C) 2008-2012, International Business Machines Corporation and    *
47935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * others. All Rights Reserved.                                                *
57935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert *******************************************************************************
67935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */
77935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertpackage com.ibm.icu.impl.javaspi.text;
87935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
97935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.text.NumberFormat;
107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.text.spi.NumberFormatProvider;
117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.util.Locale;
127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.impl.javaspi.ICULocaleServiceProvider;
147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.impl.jdkadapter.DecimalFormatICU;
157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.impl.jdkadapter.NumberFormatICU;
167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.util.ULocale;
177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertpublic class NumberFormatProviderICU extends NumberFormatProvider {
197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private final static int NUMBER   = 0;
217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private final static int INTEGER  = 1;
227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private final static int CURRENCY = 2;
237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private final static int PERCENT  = 3;
247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    @Override
267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public NumberFormat getCurrencyInstance(Locale locale) {
277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        return getInstance(CURRENCY, locale);
287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    @Override
317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public NumberFormat getIntegerInstance(Locale locale) {
327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        return getInstance(INTEGER, locale);
337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    @Override
367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public NumberFormat getNumberInstance(Locale locale) {
377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        return getInstance(NUMBER, locale);
387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    @Override
417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public NumberFormat getPercentInstance(Locale locale) {
427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        return getInstance(PERCENT, locale);
437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    @Override
467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public Locale[] getAvailableLocales() {
477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        return ICULocaleServiceProvider.getAvailableLocales();
487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private NumberFormat getInstance(int type, Locale locale) {
517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        com.ibm.icu.text.NumberFormat icuNfmt;
527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        ULocale actual = ICULocaleServiceProvider.toULocaleNoSpecialVariant(locale);
537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        switch (type) {
547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        case NUMBER:
557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            icuNfmt = com.ibm.icu.text.NumberFormat.getNumberInstance(actual);
567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            break;
577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        case INTEGER:
587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            icuNfmt = com.ibm.icu.text.NumberFormat.getIntegerInstance(actual);
597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            break;
607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        case CURRENCY:
617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            icuNfmt = com.ibm.icu.text.NumberFormat.getCurrencyInstance(actual);
627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            break;
637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        case PERCENT:
647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            icuNfmt = com.ibm.icu.text.NumberFormat.getPercentInstance(actual);
657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            break;
667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        default:
677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            return null;
687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (!(icuNfmt instanceof com.ibm.icu.text.DecimalFormat)) {
717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            // icuNfmt must be always DecimalFormat
727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            return null;
737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        NumberFormat nf = null;
767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (ICULocaleServiceProvider.useDecimalFormat()) {
777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            nf = DecimalFormatICU.wrap((com.ibm.icu.text.DecimalFormat)icuNfmt);
787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        } else {
797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            nf = NumberFormatICU.wrap(icuNfmt);
807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        }
817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        return nf;
837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert}
85