2 *******************************************************************************
\r
3 * Copyright (C) 2008, International Business Machines Corporation and *
\r
4 * others. All Rights Reserved. *
\r
5 *******************************************************************************
\r
7 package com.ibm.icu.impl.icuadapter;
\r
9 import java.math.RoundingMode;
\r
10 import java.text.FieldPosition;
\r
11 import java.text.NumberFormat;
\r
12 import java.text.ParseException;
\r
13 import java.text.ParsePosition;
\r
15 import com.ibm.icu.impl.jdkadapter.NumberFormatICU;
\r
16 import com.ibm.icu.math.BigDecimal;
\r
17 import com.ibm.icu.util.Currency;
\r
18 import com.ibm.icu.util.CurrencyAmount;
\r
21 * NumberFormatJDK is an adapter class which wraps java.text.NumberFormat and
\r
22 * implements ICU4J NumberFormat APIs.
\r
24 public class NumberFormatJDK extends com.ibm.icu.text.NumberFormat {
\r
26 private static final long serialVersionUID = -1739846528146803964L;
\r
28 private NumberFormat fJdkNfmt;
\r
30 private NumberFormatJDK(NumberFormat jdkNfmt) {
\r
34 public static com.ibm.icu.text.NumberFormat wrap(NumberFormat jdkNfmt) {
\r
35 if (jdkNfmt instanceof NumberFormatICU) {
\r
36 return ((NumberFormatICU)jdkNfmt).unwrap();
\r
38 return new NumberFormatJDK(jdkNfmt);
\r
41 public NumberFormat unwrap() {
\r
46 public Object clone() {
\r
47 NumberFormatJDK other = (NumberFormatJDK)super.clone();
\r
48 other.fJdkNfmt = (NumberFormat)fJdkNfmt.clone();
\r
53 public boolean equals(Object obj) {
\r
54 if (obj instanceof NumberFormatJDK) {
\r
55 return ((NumberFormatJDK)obj).fJdkNfmt.equals(fJdkNfmt);
\r
60 //public String format(java.math.BigDecimal number)
\r
61 //public String format(BigDecimal number)
\r
64 public StringBuffer format(java.math.BigDecimal number, StringBuffer toAppendTo, FieldPosition pos) {
\r
65 return fJdkNfmt.format(number, toAppendTo, pos);
\r
69 public StringBuffer format(BigDecimal number, StringBuffer toAppendTo, FieldPosition pos) {
\r
70 return fJdkNfmt.format(number.toBigDecimal(), toAppendTo, pos);
\r
74 public StringBuffer format(java.math.BigInteger number, StringBuffer toAppendTo, FieldPosition pos) {
\r
75 return fJdkNfmt.format(number, toAppendTo, pos);
\r
78 //public String format(java.math.BigInteger number)
\r
80 //String format(CurrencyAmount currAmt)
\r
83 public StringBuffer format(CurrencyAmount currAmt, StringBuffer toAppendTo, FieldPosition pos) {
\r
84 java.util.Currency save = fJdkNfmt.getCurrency();
\r
85 String currCode = currAmt.getCurrency().getCurrencyCode();
\r
86 boolean same = save.getCurrencyCode().equals(currCode);
\r
88 fJdkNfmt.setCurrency(java.util.Currency.getInstance(currCode));
\r
90 fJdkNfmt.format(currAmt.getNumber(), toAppendTo, pos);
\r
92 fJdkNfmt.setCurrency(save);
\r
97 //public String format(double number)
\r
100 public StringBuffer format(double number, StringBuffer toAppendTo, FieldPosition pos) {
\r
101 return fJdkNfmt.format(number, toAppendTo, pos);
\r
104 //public String format(long number)
\r
107 public StringBuffer format(long number, StringBuffer toAppendTo, FieldPosition pos) {
\r
108 return fJdkNfmt.format(number, toAppendTo, pos);
\r
112 public StringBuffer format(Object number, StringBuffer toAppendTo, FieldPosition pos) {
\r
113 return fJdkNfmt.format(number, toAppendTo, pos);
\r
117 public Currency getCurrency() {
\r
118 java.util.Currency jdkCurrency = fJdkNfmt.getCurrency();
\r
119 if (jdkCurrency == null) {
\r
122 return Currency.getInstance(jdkCurrency.getCurrencyCode());
\r
125 //protected Currency getEffectiveCurrency()
\r
128 public int getMaximumFractionDigits() {
\r
129 return fJdkNfmt.getMaximumFractionDigits();
\r
133 public int getMaximumIntegerDigits() {
\r
134 return fJdkNfmt.getMaximumIntegerDigits();
\r
138 public int getMinimumFractionDigits() {
\r
139 return fJdkNfmt.getMinimumFractionDigits();
\r
142 public int getMinumumIntegerDigits() {
\r
143 return fJdkNfmt.getMinimumIntegerDigits();
\r
147 public int getRoundingMode() {
\r
148 RoundingMode jdkMode = fJdkNfmt.getRoundingMode();
\r
149 int icuMode = BigDecimal.ROUND_UP;
\r
151 if (jdkMode.equals(RoundingMode.CEILING)) {
\r
152 icuMode = BigDecimal.ROUND_CEILING;
\r
153 } else if (jdkMode.equals(RoundingMode.DOWN)) {
\r
154 icuMode = BigDecimal.ROUND_DOWN;
\r
155 } else if (jdkMode.equals(RoundingMode.FLOOR)) {
\r
156 icuMode = BigDecimal.ROUND_FLOOR;
\r
157 } else if (jdkMode.equals(RoundingMode.HALF_DOWN)) {
\r
158 icuMode = BigDecimal.ROUND_HALF_DOWN;
\r
159 } else if (jdkMode.equals(RoundingMode.HALF_EVEN)) {
\r
160 icuMode = BigDecimal.ROUND_HALF_EVEN;
\r
161 } else if (jdkMode.equals(RoundingMode.HALF_UP)) {
\r
162 icuMode = BigDecimal.ROUND_HALF_UP;
\r
163 } else if (jdkMode.equals(RoundingMode.UNNECESSARY)) {
\r
164 icuMode = BigDecimal.ROUND_UNNECESSARY;
\r
165 } else if (jdkMode.equals(RoundingMode.UP)) {
\r
166 icuMode = BigDecimal.ROUND_UP;
\r
172 public int hashCode() {
\r
173 return fJdkNfmt.hashCode();
\r
177 public boolean isGroupingUsed() {
\r
178 return fJdkNfmt.isGroupingUsed();
\r
182 public boolean isParseIntegerOnly() {
\r
183 return fJdkNfmt.isParseIntegerOnly();
\r
187 public boolean isParseStrict() {
\r
188 // JDK NumberFormat does not support strict parsing
\r
193 public Number parse(String text) throws ParseException {
\r
194 return fJdkNfmt.parse(text);
\r
198 public Number parse(String text, ParsePosition parsePosition) {
\r
199 return fJdkNfmt.parse(text, parsePosition);
\r
202 //public Object parseObject(String source, ParsePosition parsePosition)
\r
205 public void setCurrency(Currency theCurrency) {
\r
206 if (theCurrency == null) {
\r
207 fJdkNfmt.setCurrency(null);
\r
210 fJdkNfmt.setCurrency(java.util.Currency.getInstance(theCurrency.getCurrencyCode()));
\r
215 public void setGroupingUsed(boolean newValue) {
\r
216 fJdkNfmt.setGroupingUsed(newValue);
\r
220 public void setMaximumFractionDigits(int newValue) {
\r
221 fJdkNfmt.setMaximumFractionDigits(newValue);
\r
225 public void setMaximumIntegerDigits(int newValue) {
\r
226 fJdkNfmt.setMaximumIntegerDigits(newValue);
\r
230 public void setMinimumFractionDigits(int newValue) {
\r
231 fJdkNfmt.setMinimumFractionDigits(newValue);
\r
235 public void setMinimumIntegerDigits(int newValue) {
\r
236 fJdkNfmt.setMinimumIntegerDigits(newValue);
\r
240 public void setParseIntegerOnly(boolean value) {
\r
241 fJdkNfmt.setParseIntegerOnly(value);
\r
245 public void setParseStrict(boolean value) {
\r
246 // JDK NumberFormat does not support strict parsing - ignore this operation
\r
250 public void setRoundingMode(int roundingMode) {
\r
251 RoundingMode mode = null;
\r
252 switch (roundingMode) {
\r
253 case BigDecimal.ROUND_CEILING:
\r
254 mode = RoundingMode.CEILING;
\r
256 case BigDecimal.ROUND_DOWN:
\r
257 mode = RoundingMode.DOWN;
\r
259 case BigDecimal.ROUND_FLOOR:
\r
260 mode = RoundingMode.FLOOR;
\r
262 case BigDecimal.ROUND_HALF_DOWN:
\r
263 mode = RoundingMode.HALF_DOWN;
\r
265 case BigDecimal.ROUND_HALF_EVEN:
\r
266 mode = RoundingMode.HALF_EVEN;
\r
268 case BigDecimal.ROUND_HALF_UP:
\r
269 mode = RoundingMode.HALF_UP;
\r
271 case BigDecimal.ROUND_UNNECESSARY:
\r
272 mode = RoundingMode.UNNECESSARY;
\r
274 case BigDecimal.ROUND_UP:
\r
275 mode = RoundingMode.UP;
\r
278 if (mode == null) {
\r
279 throw new IllegalArgumentException("Invalid rounding mode: " + roundingMode);
\r
281 fJdkNfmt.setRoundingMode(mode);
\r