1// © 2016 and later: Unicode, Inc. and others.
2// License & terms of use: http://www.unicode.org/copyright.html#License
3/*
4 *******************************************************************************
5 * Copyright (C) 2008, International Business Machines Corporation and         *
6 * others. All Rights Reserved.                                                *
7 *******************************************************************************
8 */
9package com.ibm.icu.impl.icuadapter;
10
11import java.math.RoundingMode;
12import java.text.FieldPosition;
13import java.text.NumberFormat;
14import java.text.ParseException;
15import java.text.ParsePosition;
16
17import com.ibm.icu.impl.jdkadapter.NumberFormatICU;
18import com.ibm.icu.math.BigDecimal;
19import com.ibm.icu.util.Currency;
20import com.ibm.icu.util.CurrencyAmount;
21
22/**
23 * NumberFormatJDK is an adapter class which wraps java.text.NumberFormat and
24 * implements ICU4J NumberFormat APIs.
25 */
26public class NumberFormatJDK extends com.ibm.icu.text.NumberFormat {
27
28    private static final long serialVersionUID = -1739846528146803964L;
29
30    private NumberFormat fJdkNfmt;
31
32    private NumberFormatJDK(NumberFormat jdkNfmt) {
33        fJdkNfmt = jdkNfmt;
34    }
35
36    public static com.ibm.icu.text.NumberFormat wrap(NumberFormat jdkNfmt) {
37        if (jdkNfmt instanceof NumberFormatICU) {
38            return ((NumberFormatICU)jdkNfmt).unwrap();
39        }
40        return new NumberFormatJDK(jdkNfmt);
41    }
42
43    public NumberFormat unwrap() {
44        return fJdkNfmt;
45    }
46
47    @Override
48    public Object clone() {
49        NumberFormatJDK other = (NumberFormatJDK)super.clone();
50        other.fJdkNfmt = (NumberFormat)fJdkNfmt.clone();
51        return other;
52    }
53
54    @Override
55    public boolean equals(Object obj) {
56        if (obj instanceof NumberFormatJDK) {
57            return ((NumberFormatJDK)obj).fJdkNfmt.equals(fJdkNfmt);
58        }
59        return false;
60    }
61
62    //public String format(java.math.BigDecimal number)
63    //public String format(BigDecimal number)
64
65    @Override
66    public StringBuffer format(java.math.BigDecimal number, StringBuffer toAppendTo, FieldPosition pos) {
67        return fJdkNfmt.format(number, toAppendTo, pos);
68    }
69
70    @Override
71    public StringBuffer format(BigDecimal number, StringBuffer toAppendTo, FieldPosition pos) {
72        return fJdkNfmt.format(number.toBigDecimal(), toAppendTo, pos);
73    }
74
75    @Override
76    public StringBuffer format(java.math.BigInteger number, StringBuffer toAppendTo, FieldPosition pos) {
77        return fJdkNfmt.format(number, toAppendTo, pos);
78    }
79
80    //public String format(java.math.BigInteger number)
81
82    //String format(CurrencyAmount currAmt)
83
84    @Override
85    public StringBuffer format(CurrencyAmount currAmt, StringBuffer toAppendTo, FieldPosition pos) {
86        java.util.Currency save = fJdkNfmt.getCurrency();
87        String currCode = currAmt.getCurrency().getCurrencyCode();
88        boolean same = save.getCurrencyCode().equals(currCode);
89        if (!same) {
90            fJdkNfmt.setCurrency(java.util.Currency.getInstance(currCode));
91        }
92        fJdkNfmt.format(currAmt.getNumber(), toAppendTo, pos);
93        if (!same) {
94            fJdkNfmt.setCurrency(save);
95        }
96        return toAppendTo;
97    }
98
99    //public String format(double number)
100
101    @Override
102    public StringBuffer format(double number, StringBuffer toAppendTo, FieldPosition pos) {
103        return fJdkNfmt.format(number, toAppendTo, pos);
104    }
105
106    //public String format(long number)
107
108    @Override
109    public StringBuffer format(long number, StringBuffer toAppendTo, FieldPosition pos) {
110        return fJdkNfmt.format(number, toAppendTo, pos);
111    }
112
113    @Override
114    public StringBuffer format(Object number, StringBuffer toAppendTo, FieldPosition pos) {
115        return fJdkNfmt.format(number, toAppendTo, pos);
116    }
117
118    @Override
119    public Currency getCurrency() {
120        java.util.Currency jdkCurrency = fJdkNfmt.getCurrency();
121        if (jdkCurrency == null) {
122            return null;
123        }
124        return Currency.getInstance(jdkCurrency.getCurrencyCode());
125    }
126
127    //protected Currency getEffectiveCurrency()
128
129    @Override
130    public int getMaximumFractionDigits() {
131        return fJdkNfmt.getMaximumFractionDigits();
132    }
133
134    @Override
135    public int getMaximumIntegerDigits() {
136        return fJdkNfmt.getMaximumIntegerDigits();
137    }
138
139    @Override
140    public int getMinimumFractionDigits() {
141        return fJdkNfmt.getMinimumFractionDigits();
142    }
143
144    public int getMinumumIntegerDigits() {
145        return fJdkNfmt.getMinimumIntegerDigits();
146    }
147
148    @Override
149    public int getRoundingMode() {
150        RoundingMode jdkMode = fJdkNfmt.getRoundingMode();
151        int icuMode = BigDecimal.ROUND_UP;
152
153        if (jdkMode.equals(RoundingMode.CEILING)) {
154            icuMode = BigDecimal.ROUND_CEILING;
155        } else if (jdkMode.equals(RoundingMode.DOWN)) {
156            icuMode = BigDecimal.ROUND_DOWN;
157        } else if (jdkMode.equals(RoundingMode.FLOOR)) {
158            icuMode = BigDecimal.ROUND_FLOOR;
159        } else if (jdkMode.equals(RoundingMode.HALF_DOWN)) {
160            icuMode = BigDecimal.ROUND_HALF_DOWN;
161        } else if (jdkMode.equals(RoundingMode.HALF_EVEN)) {
162            icuMode = BigDecimal.ROUND_HALF_EVEN;
163        } else if (jdkMode.equals(RoundingMode.HALF_UP)) {
164            icuMode = BigDecimal.ROUND_HALF_UP;
165        } else if (jdkMode.equals(RoundingMode.UNNECESSARY)) {
166            icuMode = BigDecimal.ROUND_UNNECESSARY;
167        } else if (jdkMode.equals(RoundingMode.UP)) {
168            icuMode = BigDecimal.ROUND_UP;
169        }
170        return icuMode;
171    }
172
173    @Override
174    public int hashCode() {
175        return fJdkNfmt.hashCode();
176    }
177
178    @Override
179    public boolean isGroupingUsed() {
180        return fJdkNfmt.isGroupingUsed();
181    }
182
183    @Override
184    public boolean isParseIntegerOnly() {
185        return fJdkNfmt.isParseIntegerOnly();
186    }
187
188    @Override
189    public boolean isParseStrict() {
190        // JDK NumberFormat does not support strict parsing
191        return false;
192    }
193
194    @Override
195    public Number parse(String text) throws ParseException {
196        return fJdkNfmt.parse(text);
197    }
198
199    @Override
200    public Number parse(String text, ParsePosition parsePosition) {
201        return fJdkNfmt.parse(text, parsePosition);
202    }
203
204    //public Object parseObject(String source, ParsePosition parsePosition)
205
206    @Override
207    public void setCurrency(Currency theCurrency) {
208        if (theCurrency == null) {
209            fJdkNfmt.setCurrency(null);
210            return;
211        } else {
212            fJdkNfmt.setCurrency(java.util.Currency.getInstance(theCurrency.getCurrencyCode()));
213        }
214    }
215
216    @Override
217    public void setGroupingUsed(boolean newValue) {
218        fJdkNfmt.setGroupingUsed(newValue);
219    }
220
221    @Override
222    public void setMaximumFractionDigits(int newValue) {
223        fJdkNfmt.setMaximumFractionDigits(newValue);
224    }
225
226    @Override
227    public void setMaximumIntegerDigits(int newValue) {
228        fJdkNfmt.setMaximumIntegerDigits(newValue);
229    }
230
231    @Override
232    public void setMinimumFractionDigits(int newValue) {
233        fJdkNfmt.setMinimumFractionDigits(newValue);
234    }
235
236    @Override
237    public void setMinimumIntegerDigits(int newValue) {
238        fJdkNfmt.setMinimumIntegerDigits(newValue);
239    }
240
241    @Override
242    public void setParseIntegerOnly(boolean value) {
243        fJdkNfmt.setParseIntegerOnly(value);
244    }
245
246    @Override
247    public void setParseStrict(boolean value) {
248        // JDK NumberFormat does not support strict parsing - ignore this operation
249    }
250
251    @Override
252    public void setRoundingMode(int roundingMode) {
253        RoundingMode mode = null;
254        switch (roundingMode) {
255        case BigDecimal.ROUND_CEILING:
256            mode = RoundingMode.CEILING;
257            break;
258        case BigDecimal.ROUND_DOWN:
259            mode = RoundingMode.DOWN;
260            break;
261        case BigDecimal.ROUND_FLOOR:
262            mode = RoundingMode.FLOOR;
263            break;
264        case BigDecimal.ROUND_HALF_DOWN:
265            mode = RoundingMode.HALF_DOWN;
266            break;
267        case BigDecimal.ROUND_HALF_EVEN:
268            mode = RoundingMode.HALF_EVEN;
269            break;
270        case BigDecimal.ROUND_HALF_UP:
271            mode = RoundingMode.HALF_UP;
272            break;
273        case BigDecimal.ROUND_UNNECESSARY:
274            mode = RoundingMode.UNNECESSARY;
275            break;
276        case BigDecimal.ROUND_UP:
277            mode = RoundingMode.UP;
278            break;
279        }
280        if (mode == null) {
281            throw new IllegalArgumentException("Invalid rounding mode: " + roundingMode);
282        }
283        fJdkNfmt.setRoundingMode(mode);
284    }
285}