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.jdkadapter;
\r
9 import java.math.RoundingMode;
\r
10 import java.text.AttributedCharacterIterator;
\r
11 import java.text.AttributedString;
\r
12 import java.text.CharacterIterator;
\r
13 import java.text.DecimalFormatSymbols;
\r
14 import java.text.FieldPosition;
\r
15 import java.text.ParsePosition;
\r
16 import java.util.Currency;
\r
17 import java.util.HashMap;
\r
18 import java.util.Map;
\r
19 import java.util.Set;
\r
21 import com.ibm.icu.text.DecimalFormat;
\r
22 import com.ibm.icu.text.NumberFormat;
\r
25 * DecimalFormatICU is an adapter class which wraps ICU4J DecimalFormat and
\r
26 * implements java.text.DecimalFormat APIs.
\r
28 public class DecimalFormatICU extends java.text.DecimalFormat {
\r
30 private static final long serialVersionUID = 6441573352964019403L;
\r
32 private DecimalFormat fIcuDecfmt;
\r
34 private DecimalFormatICU(DecimalFormat icuDecfmt) {
\r
35 fIcuDecfmt = icuDecfmt;
\r
38 public static java.text.DecimalFormat wrap(DecimalFormat icuDecfmt) {
\r
39 return new DecimalFormatICU(icuDecfmt);
\r
42 public DecimalFormat unwrap() {
\r
46 // Methods overriding java.text.DecimalFormat
\r
48 public void applyLocalizedPattern(String pattern) {
\r
49 fIcuDecfmt.applyLocalizedPattern(pattern);
\r
53 public void applyPattern(String pattern) {
\r
54 fIcuDecfmt.applyPattern(pattern);
\r
58 public Object clone() {
\r
59 DecimalFormatICU other = (DecimalFormatICU)super.clone();
\r
60 other.fIcuDecfmt = (DecimalFormat)fIcuDecfmt.clone();
\r
65 public boolean equals(Object obj) {
\r
66 if (obj instanceof DecimalFormatICU) {
\r
67 return ((DecimalFormatICU)obj).fIcuDecfmt.equals(fIcuDecfmt);
\r
73 public StringBuffer format(double number, StringBuffer result, FieldPosition fieldPosition) {
\r
74 return fIcuDecfmt.format(number, result, fieldPosition);
\r
78 public StringBuffer format(long number, StringBuffer result, FieldPosition fieldPosition) {
\r
79 return fIcuDecfmt.format(number, result, fieldPosition);
\r
83 public AttributedCharacterIterator formatToCharacterIterator(Object obj) {
\r
84 AttributedCharacterIterator aci = fIcuDecfmt.formatToCharacterIterator(obj);
\r
86 // Create a new AttributedString
\r
87 StringBuilder sb = new StringBuilder(aci.getEndIndex() - aci.getBeginIndex());
\r
88 char c = aci.first();
\r
92 if (c == CharacterIterator.DONE) {
\r
96 AttributedString resstr = new AttributedString(sb.toString());
\r
98 // Mapping attributes
\r
99 Map<AttributedCharacterIterator.Attribute,Object> attributes = null;
\r
100 int index = aci.getBeginIndex();
\r
103 if (aci.setIndex(index) == CharacterIterator.DONE) {
\r
106 attributes = aci.getAttributes();
\r
107 if (attributes != null) {
\r
108 int end = aci.getRunLimit();
\r
109 Map<AttributedCharacterIterator.Attribute,Object> jdkAttributes =
\r
110 new HashMap<AttributedCharacterIterator.Attribute,Object>();
\r
111 Set<AttributedCharacterIterator.Attribute> keys = attributes.keySet();
\r
112 for (AttributedCharacterIterator.Attribute key : keys) {
\r
113 AttributedCharacterIterator.Attribute jdkKey = mapAttribute(key);
\r
114 Object jdkVal = attributes.get(key);
\r
115 if (jdkVal instanceof AttributedCharacterIterator.Attribute) {
\r
116 jdkVal = mapAttribute((AttributedCharacterIterator.Attribute)jdkVal);
\r
118 jdkAttributes.put(jdkKey, jdkVal);
\r
120 int resend = residx + (end - index);
\r
121 resstr.addAttributes(jdkAttributes, residx, resend);
\r
127 return resstr.getIterator();
\r
131 public Currency getCurrency() {
\r
132 com.ibm.icu.util.Currency icuCurrency = fIcuDecfmt.getCurrency();
\r
133 if (icuCurrency == null) {
\r
136 return Currency.getInstance(icuCurrency.getCurrencyCode());
\r
140 public DecimalFormatSymbols getDecimalFormatSymbols() {
\r
141 return DecimalFormatSymbolsICU.wrap(fIcuDecfmt.getDecimalFormatSymbols());
\r
145 public int getGroupingSize() {
\r
146 return fIcuDecfmt.getGroupingSize();
\r
150 public int getMaximumFractionDigits() {
\r
151 return fIcuDecfmt.getMaximumFractionDigits();
\r
155 public int getMaximumIntegerDigits() {
\r
156 return fIcuDecfmt.getMaximumIntegerDigits();
\r
160 public int getMinimumFractionDigits() {
\r
161 return fIcuDecfmt.getMinimumFractionDigits();
\r
165 public int getMinimumIntegerDigits() {
\r
166 return fIcuDecfmt.getMinimumIntegerDigits();
\r
170 public int getMultiplier() {
\r
171 return fIcuDecfmt.getMultiplier();
\r
175 public String getNegativePrefix() {
\r
176 return fIcuDecfmt.getNegativePrefix();
\r
180 public String getNegativeSuffix() {
\r
181 return fIcuDecfmt.getNegativeSuffix();
\r
185 public String getPositivePrefix() {
\r
186 return fIcuDecfmt.getPositivePrefix();
\r
190 public String getPositiveSuffix() {
\r
191 return fIcuDecfmt.getPositiveSuffix();
\r
195 public RoundingMode getRoundingMode() {
\r
196 int icuMode = fIcuDecfmt.getRoundingMode();
\r
197 RoundingMode mode = RoundingMode.UP;
\r
199 case com.ibm.icu.math.BigDecimal.ROUND_CEILING:
\r
200 mode = RoundingMode.CEILING;
\r
202 case com.ibm.icu.math.BigDecimal.ROUND_DOWN:
\r
203 mode = RoundingMode.DOWN;
\r
205 case com.ibm.icu.math.BigDecimal.ROUND_FLOOR:
\r
206 mode = RoundingMode.FLOOR;
\r
208 case com.ibm.icu.math.BigDecimal.ROUND_HALF_DOWN:
\r
209 mode = RoundingMode.HALF_DOWN;
\r
211 case com.ibm.icu.math.BigDecimal.ROUND_HALF_EVEN:
\r
212 mode = RoundingMode.HALF_EVEN;
\r
214 case com.ibm.icu.math.BigDecimal.ROUND_HALF_UP:
\r
215 mode = RoundingMode.HALF_UP;
\r
217 case com.ibm.icu.math.BigDecimal.ROUND_UNNECESSARY:
\r
218 mode = RoundingMode.UNNECESSARY;
\r
220 case com.ibm.icu.math.BigDecimal.ROUND_UP:
\r
221 mode = RoundingMode.UP;
\r
228 public int hashCode() {
\r
229 return fIcuDecfmt.hashCode();
\r
233 public boolean isDecimalSeparatorAlwaysShown() {
\r
234 return fIcuDecfmt.isDecimalSeparatorAlwaysShown();
\r
238 public boolean isParseBigDecimal() {
\r
239 return fIcuDecfmt.isParseBigDecimal();
\r
243 public Number parse(String text, ParsePosition pos) {
\r
244 return fIcuDecfmt.parse(text, pos);
\r
248 public void setCurrency(Currency currency) {
\r
249 if (currency == null) {
\r
250 fIcuDecfmt.setCurrency(null);
\r
252 fIcuDecfmt.setCurrency(com.ibm.icu.util.Currency.getInstance(currency.getCurrencyCode()));
\r
257 public void setDecimalFormatSymbols(DecimalFormatSymbols newSymbols) {
\r
258 com.ibm.icu.text.DecimalFormatSymbols icuDecfs = null;
\r
259 if (newSymbols instanceof DecimalFormatSymbolsICU) {
\r
260 icuDecfs = ((DecimalFormatSymbolsICU)newSymbols).unwrap();
\r
262 icuDecfs = fIcuDecfmt.getDecimalFormatSymbols();
\r
264 Currency currency = newSymbols.getCurrency();
\r
265 if (currency == null) {
\r
266 icuDecfs.setCurrency(null);
\r
268 icuDecfs.setCurrency(com.ibm.icu.util.Currency.getInstance(currency.getCurrencyCode()));
\r
272 icuDecfs.setCurrencySymbol(newSymbols.getCurrencySymbol());
\r
273 icuDecfs.setDecimalSeparator(newSymbols.getDecimalSeparator());
\r
274 icuDecfs.setDigit(newSymbols.getDigit());
\r
275 icuDecfs.setExponentSeparator(newSymbols.getExponentSeparator());
\r
276 icuDecfs.setGroupingSeparator(newSymbols.getGroupingSeparator());
\r
277 icuDecfs.setInfinity(newSymbols.getInfinity());
\r
278 icuDecfs.setInternationalCurrencySymbol(newSymbols.getInternationalCurrencySymbol());
\r
279 icuDecfs.setMinusSign(newSymbols.getMinusSign());
\r
280 icuDecfs.setMonetaryDecimalSeparator(newSymbols.getMonetaryDecimalSeparator());
\r
281 icuDecfs.setNaN(newSymbols.getNaN());
\r
282 icuDecfs.setPatternSeparator(newSymbols.getPatternSeparator());
\r
283 icuDecfs.setPercent(newSymbols.getPercent());
\r
284 icuDecfs.setPerMill(newSymbols.getPerMill());
\r
285 icuDecfs.setZeroDigit(newSymbols.getZeroDigit());
\r
287 fIcuDecfmt.setDecimalFormatSymbols(icuDecfs);
\r
291 public void setDecimalSeparatorAlwaysShown(boolean newValue) {
\r
292 if (fIcuDecfmt != null) {
\r
293 fIcuDecfmt.setDecimalSeparatorAlwaysShown(newValue);
\r
298 public void setGroupingSize(int newValue) {
\r
299 if (fIcuDecfmt != null) {
\r
300 fIcuDecfmt.setGroupingSize(newValue);
\r
305 public void setMaximumFractionDigits(int newValue) {
\r
306 if (fIcuDecfmt != null) {
\r
307 fIcuDecfmt.setMaximumFractionDigits(newValue);
\r
312 public void setMaximumIntegerDigits(int newValue) {
\r
313 if (fIcuDecfmt != null) {
\r
314 fIcuDecfmt.setMaximumIntegerDigits(newValue);
\r
319 public void setMinimumFractionDigits(int newValue) {
\r
320 if (fIcuDecfmt != null) {
\r
321 fIcuDecfmt.setMinimumFractionDigits(newValue);
\r
326 public void setMinimumIntegerDigits(int newValue) {
\r
327 if (fIcuDecfmt != null) {
\r
328 fIcuDecfmt.setMinimumIntegerDigits(newValue);
\r
333 public void setMultiplier(int newValue) {
\r
334 fIcuDecfmt.setMultiplier(newValue);
\r
338 public void setNegativePrefix(String newValue) {
\r
339 fIcuDecfmt.setNegativePrefix(newValue);
\r
343 public void setNegativeSuffix(String newValue) {
\r
344 fIcuDecfmt.setNegativeSuffix(newValue);
\r
348 public void setParseBigDecimal(boolean newValue) {
\r
349 fIcuDecfmt.setParseBigDecimal(newValue);
\r
353 public void setPositivePrefix(String newValue) {
\r
354 fIcuDecfmt.setPositivePrefix(newValue);
\r
358 public void setPositiveSuffix(String newValue) {
\r
359 fIcuDecfmt.setPositiveSuffix(newValue);
\r
363 public void setRoundingMode(RoundingMode roundingMode) {
\r
364 if (roundingMode.equals(RoundingMode.CEILING)) {
\r
365 fIcuDecfmt.setRoundingMode(com.ibm.icu.math.BigDecimal.ROUND_CEILING);
\r
366 } else if (roundingMode.equals(RoundingMode.DOWN)) {
\r
367 fIcuDecfmt.setRoundingMode(com.ibm.icu.math.BigDecimal.ROUND_DOWN);
\r
368 } else if (roundingMode.equals(RoundingMode.FLOOR)) {
\r
369 fIcuDecfmt.setRoundingMode(com.ibm.icu.math.BigDecimal.ROUND_FLOOR);
\r
370 } else if (roundingMode.equals(RoundingMode.HALF_DOWN)) {
\r
371 fIcuDecfmt.setRoundingMode(com.ibm.icu.math.BigDecimal.ROUND_HALF_DOWN);
\r
372 } else if (roundingMode.equals(RoundingMode.HALF_EVEN)) {
\r
373 fIcuDecfmt.setRoundingMode(com.ibm.icu.math.BigDecimal.ROUND_HALF_EVEN);
\r
374 } else if (roundingMode.equals(RoundingMode.HALF_UP)) {
\r
375 fIcuDecfmt.setRoundingMode(com.ibm.icu.math.BigDecimal.ROUND_HALF_UP);
\r
376 } else if (roundingMode.equals(RoundingMode.UNNECESSARY)) {
\r
377 fIcuDecfmt.setRoundingMode(com.ibm.icu.math.BigDecimal.ROUND_UNNECESSARY);
\r
378 } else if (roundingMode.equals(RoundingMode.UP)) {
\r
379 fIcuDecfmt.setRoundingMode(com.ibm.icu.math.BigDecimal.ROUND_UP);
\r
381 throw new IllegalArgumentException("Invalid rounding mode was specified.");
\r
386 public String toLocalizedPattern() {
\r
387 return fIcuDecfmt.toLocalizedPattern();
\r
391 public String toPattern() {
\r
392 return fIcuDecfmt.toPattern();
\r
395 // Methods overriding java.text.NumberFormat
\r
398 public boolean isGroupingUsed() {
\r
399 return fIcuDecfmt.isGroupingUsed();
\r
403 public boolean isParseIntegerOnly() {
\r
404 return fIcuDecfmt.isParseIntegerOnly();
\r
408 public void setGroupingUsed(boolean newValue) {
\r
409 if (fIcuDecfmt != null) {
\r
410 fIcuDecfmt.setGroupingUsed(newValue);
\r
415 public void setParseIntegerOnly(boolean value) {
\r
416 fIcuDecfmt.setParseIntegerOnly(value);
\r
419 private static AttributedCharacterIterator.Attribute mapAttribute(AttributedCharacterIterator.Attribute icuAttribute) {
\r
420 AttributedCharacterIterator.Attribute jdkAttribute = icuAttribute;
\r
422 if (icuAttribute == NumberFormat.Field.CURRENCY) {
\r
423 jdkAttribute = java.text.NumberFormat.Field.CURRENCY;
\r
424 } else if (icuAttribute == NumberFormat.Field.DECIMAL_SEPARATOR) {
\r
425 jdkAttribute = java.text.NumberFormat.Field.DECIMAL_SEPARATOR;
\r
426 } else if (icuAttribute == NumberFormat.Field.EXPONENT) {
\r
427 jdkAttribute = java.text.NumberFormat.Field.EXPONENT;
\r
428 } else if (icuAttribute == NumberFormat.Field.EXPONENT_SIGN) {
\r
429 jdkAttribute = java.text.NumberFormat.Field.EXPONENT_SIGN;
\r
430 } else if (icuAttribute == NumberFormat.Field.EXPONENT_SYMBOL) {
\r
431 jdkAttribute = java.text.NumberFormat.Field.EXPONENT_SYMBOL;
\r
432 } else if (icuAttribute == NumberFormat.Field.FRACTION) {
\r
433 jdkAttribute = java.text.NumberFormat.Field.FRACTION;
\r
434 } else if (icuAttribute == NumberFormat.Field.GROUPING_SEPARATOR) {
\r
435 jdkAttribute = java.text.NumberFormat.Field.GROUPING_SEPARATOR;
\r
436 } else if (icuAttribute == NumberFormat.Field.INTEGER) {
\r
437 jdkAttribute = java.text.NumberFormat.Field.INTEGER;
\r
438 } else if (icuAttribute == NumberFormat.Field.PERCENT) {
\r
439 jdkAttribute = java.text.NumberFormat.Field.PERCENT;
\r
440 } else if (icuAttribute == NumberFormat.Field.PERMILLE) {
\r
441 jdkAttribute = java.text.NumberFormat.Field.PERMILLE;
\r
442 } else if (icuAttribute == NumberFormat.Field.SIGN) {
\r
443 jdkAttribute = java.text.NumberFormat.Field.SIGN;
\r
446 return jdkAttribute;
\r