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