1/*
2 *******************************************************************************
3 * Copyright (C) 2008-2012, International Business Machines Corporation and    *
4 * others. All Rights Reserved.                                                *
5 *******************************************************************************
6 */
7package com.ibm.icu.impl.javaspi.text;
8
9import java.text.NumberFormat;
10import java.text.spi.NumberFormatProvider;
11import java.util.Locale;
12
13import com.ibm.icu.impl.javaspi.ICULocaleServiceProvider;
14import com.ibm.icu.impl.jdkadapter.DecimalFormatICU;
15import com.ibm.icu.impl.jdkadapter.NumberFormatICU;
16import com.ibm.icu.util.ULocale;
17
18public class NumberFormatProviderICU extends NumberFormatProvider {
19
20    private final static int NUMBER   = 0;
21    private final static int INTEGER  = 1;
22    private final static int CURRENCY = 2;
23    private final static int PERCENT  = 3;
24
25    @Override
26    public NumberFormat getCurrencyInstance(Locale locale) {
27        return getInstance(CURRENCY, locale);
28    }
29
30    @Override
31    public NumberFormat getIntegerInstance(Locale locale) {
32        return getInstance(INTEGER, locale);
33    }
34
35    @Override
36    public NumberFormat getNumberInstance(Locale locale) {
37        return getInstance(NUMBER, locale);
38    }
39
40    @Override
41    public NumberFormat getPercentInstance(Locale locale) {
42        return getInstance(PERCENT, locale);
43    }
44
45    @Override
46    public Locale[] getAvailableLocales() {
47        return ICULocaleServiceProvider.getAvailableLocales();
48    }
49
50    private NumberFormat getInstance(int type, Locale locale) {
51        com.ibm.icu.text.NumberFormat icuNfmt;
52        ULocale actual = ICULocaleServiceProvider.toULocaleNoSpecialVariant(locale);
53        switch (type) {
54        case NUMBER:
55            icuNfmt = com.ibm.icu.text.NumberFormat.getNumberInstance(actual);
56            break;
57        case INTEGER:
58            icuNfmt = com.ibm.icu.text.NumberFormat.getIntegerInstance(actual);
59            break;
60        case CURRENCY:
61            icuNfmt = com.ibm.icu.text.NumberFormat.getCurrencyInstance(actual);
62            break;
63        case PERCENT:
64            icuNfmt = com.ibm.icu.text.NumberFormat.getPercentInstance(actual);
65            break;
66        default:
67            return null;
68        }
69
70        if (!(icuNfmt instanceof com.ibm.icu.text.DecimalFormat)) {
71            // icuNfmt must be always DecimalFormat
72            return null;
73        }
74
75        NumberFormat nf = null;
76        if (ICULocaleServiceProvider.useDecimalFormat()) {
77            nf = DecimalFormatICU.wrap((com.ibm.icu.text.DecimalFormat)icuNfmt);
78        } else {
79            nf = NumberFormatICU.wrap(icuNfmt);
80        }
81
82        return nf;
83    }
84}
85