]> gitweb.fperrin.net Git - Dictionary.git/blob - jars/icu4j-4_4_2-src/main/classes/localespi/src/com/ibm/icu/impl/jdkadapter/DecimalFormatICU.java
go
[Dictionary.git] / jars / icu4j-4_4_2-src / main / classes / localespi / src / com / ibm / icu / impl / jdkadapter / DecimalFormatICU.java
1 /*\r
2  *******************************************************************************\r
3  * Copyright (C) 2008, International Business Machines Corporation and         *\r
4  * others. All Rights Reserved.                                                *\r
5  *******************************************************************************\r
6  */\r
7 package com.ibm.icu.impl.jdkadapter;\r
8 \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
20 \r
21 import com.ibm.icu.text.DecimalFormat;\r
22 import com.ibm.icu.text.NumberFormat;\r
23 \r
24 /**\r
25  * DecimalFormatICU is an adapter class which wraps ICU4J DecimalFormat and\r
26  * implements java.text.DecimalFormat APIs.\r
27  */\r
28 public class DecimalFormatICU extends java.text.DecimalFormat {\r
29 \r
30     private static final long serialVersionUID = 6441573352964019403L;\r
31 \r
32     private DecimalFormat fIcuDecfmt;\r
33 \r
34     private DecimalFormatICU(DecimalFormat icuDecfmt) {\r
35         fIcuDecfmt = icuDecfmt;\r
36     }\r
37 \r
38     public static java.text.DecimalFormat wrap(DecimalFormat icuDecfmt) {\r
39         return new DecimalFormatICU(icuDecfmt);\r
40     }\r
41 \r
42     public DecimalFormat unwrap() {\r
43         return fIcuDecfmt;\r
44     }\r
45 \r
46     // Methods overriding java.text.DecimalFormat\r
47     @Override\r
48     public void applyLocalizedPattern(String pattern) {\r
49         fIcuDecfmt.applyLocalizedPattern(pattern);\r
50     }\r
51 \r
52     @Override\r
53     public void applyPattern(String pattern) {\r
54         fIcuDecfmt.applyPattern(pattern);\r
55     }\r
56 \r
57     @Override\r
58     public Object clone() {\r
59         DecimalFormatICU other = (DecimalFormatICU)super.clone();\r
60         other.fIcuDecfmt = (DecimalFormat)fIcuDecfmt.clone();\r
61         return other;\r
62     }\r
63 \r
64     @Override\r
65     public boolean equals(Object obj) {\r
66         if (obj instanceof DecimalFormatICU) {\r
67             return ((DecimalFormatICU)obj).fIcuDecfmt.equals(fIcuDecfmt);\r
68         }\r
69         return false;\r
70     }\r
71 \r
72     @Override\r
73     public StringBuffer format(double number, StringBuffer result, FieldPosition fieldPosition) {\r
74         return fIcuDecfmt.format(number, result, fieldPosition);\r
75     }\r
76 \r
77     @Override\r
78     public StringBuffer format(long number, StringBuffer result, FieldPosition fieldPosition) {\r
79         return fIcuDecfmt.format(number, result, fieldPosition);\r
80     }\r
81 \r
82     @Override\r
83     public AttributedCharacterIterator formatToCharacterIterator(Object obj) {\r
84         AttributedCharacterIterator aci = fIcuDecfmt.formatToCharacterIterator(obj);\r
85 \r
86         // Create a new AttributedString\r
87         StringBuilder sb = new StringBuilder(aci.getEndIndex() - aci.getBeginIndex());\r
88         char c = aci.first();\r
89         while (true) {\r
90             sb.append(c);\r
91             c = aci.next();\r
92             if (c == CharacterIterator.DONE) {\r
93                 break;\r
94             }\r
95         }\r
96         AttributedString resstr = new AttributedString(sb.toString());\r
97 \r
98         // Mapping attributes\r
99         Map<AttributedCharacterIterator.Attribute,Object> attributes = null;\r
100         int index = aci.getBeginIndex();\r
101         int residx = 0;\r
102         while (true) {\r
103             if (aci.setIndex(index) == CharacterIterator.DONE) {\r
104                 break;\r
105             }\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
117                     }\r
118                     jdkAttributes.put(jdkKey, jdkVal);\r
119                 }\r
120                 int resend = residx + (end - index);\r
121                 resstr.addAttributes(jdkAttributes, residx, resend);\r
122 \r
123                 index = end;\r
124                 residx = resend;\r
125             }\r
126         }\r
127         return resstr.getIterator();\r
128     }\r
129 \r
130     @Override\r
131     public Currency getCurrency() {\r
132         com.ibm.icu.util.Currency icuCurrency = fIcuDecfmt.getCurrency();\r
133         if (icuCurrency == null) {\r
134             return null;\r
135         }\r
136         return Currency.getInstance(icuCurrency.getCurrencyCode());\r
137     }\r
138 \r
139     @Override\r
140     public DecimalFormatSymbols getDecimalFormatSymbols() {\r
141         return DecimalFormatSymbolsICU.wrap(fIcuDecfmt.getDecimalFormatSymbols());\r
142     }\r
143 \r
144     @Override\r
145     public int getGroupingSize() {\r
146         return fIcuDecfmt.getGroupingSize();\r
147     }\r
148 \r
149     @Override\r
150     public int getMaximumFractionDigits() {\r
151         return fIcuDecfmt.getMaximumFractionDigits();\r
152     }\r
153 \r
154     @Override\r
155     public int getMaximumIntegerDigits() {\r
156         return fIcuDecfmt.getMaximumIntegerDigits();\r
157     }\r
158 \r
159     @Override\r
160     public int getMinimumFractionDigits() {\r
161         return fIcuDecfmt.getMinimumFractionDigits();\r
162     }\r
163 \r
164     @Override\r
165     public int getMinimumIntegerDigits() {\r
166         return fIcuDecfmt.getMinimumIntegerDigits();\r
167     }\r
168 \r
169     @Override\r
170     public int getMultiplier() {\r
171         return fIcuDecfmt.getMultiplier();\r
172     }\r
173 \r
174     @Override\r
175     public String getNegativePrefix() {\r
176         return fIcuDecfmt.getNegativePrefix();\r
177     }\r
178 \r
179     @Override\r
180     public String getNegativeSuffix() {\r
181         return fIcuDecfmt.getNegativeSuffix();\r
182     }\r
183 \r
184     @Override\r
185     public String getPositivePrefix() {\r
186         return fIcuDecfmt.getPositivePrefix();\r
187     }\r
188 \r
189     @Override\r
190     public String getPositiveSuffix() {\r
191         return fIcuDecfmt.getPositiveSuffix();\r
192     }\r
193 \r
194     @Override\r
195     public RoundingMode getRoundingMode() {\r
196         int icuMode = fIcuDecfmt.getRoundingMode();\r
197         RoundingMode mode = RoundingMode.UP;\r
198         switch (icuMode) {\r
199         case com.ibm.icu.math.BigDecimal.ROUND_CEILING:\r
200             mode = RoundingMode.CEILING;\r
201             break;\r
202         case com.ibm.icu.math.BigDecimal.ROUND_DOWN:\r
203             mode = RoundingMode.DOWN;\r
204             break;\r
205         case com.ibm.icu.math.BigDecimal.ROUND_FLOOR:\r
206             mode = RoundingMode.FLOOR;\r
207             break;\r
208         case com.ibm.icu.math.BigDecimal.ROUND_HALF_DOWN:\r
209             mode = RoundingMode.HALF_DOWN;\r
210             break;\r
211         case com.ibm.icu.math.BigDecimal.ROUND_HALF_EVEN:\r
212             mode = RoundingMode.HALF_EVEN;\r
213             break;\r
214         case com.ibm.icu.math.BigDecimal.ROUND_HALF_UP:\r
215             mode = RoundingMode.HALF_UP;\r
216             break;\r
217         case com.ibm.icu.math.BigDecimal.ROUND_UNNECESSARY:\r
218             mode = RoundingMode.UNNECESSARY;\r
219             break;\r
220         case com.ibm.icu.math.BigDecimal.ROUND_UP:\r
221             mode = RoundingMode.UP;\r
222             break;\r
223         }\r
224         return mode;\r
225     }\r
226 \r
227     @Override\r
228     public int hashCode() {\r
229         return fIcuDecfmt.hashCode();\r
230     }\r
231 \r
232     @Override\r
233     public boolean isDecimalSeparatorAlwaysShown() {\r
234         return fIcuDecfmt.isDecimalSeparatorAlwaysShown();\r
235     }\r
236 \r
237     @Override\r
238     public boolean isParseBigDecimal() {\r
239         return fIcuDecfmt.isParseBigDecimal();\r
240     }\r
241 \r
242     @Override\r
243     public Number parse(String text, ParsePosition pos) {\r
244         return fIcuDecfmt.parse(text, pos);\r
245     }\r
246 \r
247     @Override\r
248     public void setCurrency(Currency currency) {\r
249         if (currency == null) {\r
250             fIcuDecfmt.setCurrency(null);\r
251         } else {\r
252             fIcuDecfmt.setCurrency(com.ibm.icu.util.Currency.getInstance(currency.getCurrencyCode()));\r
253         }\r
254     }\r
255 \r
256     @Override\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
261         } else {\r
262             icuDecfs = fIcuDecfmt.getDecimalFormatSymbols();\r
263 \r
264             Currency currency = newSymbols.getCurrency();\r
265             if (currency == null) {\r
266                 icuDecfs.setCurrency(null);\r
267             } else {\r
268                 icuDecfs.setCurrency(com.ibm.icu.util.Currency.getInstance(currency.getCurrencyCode()));\r
269             }\r
270 \r
271             // Copy symbols\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
286         }\r
287         fIcuDecfmt.setDecimalFormatSymbols(icuDecfs);\r
288     }\r
289 \r
290     @Override\r
291     public void setDecimalSeparatorAlwaysShown(boolean newValue) {\r
292         if (fIcuDecfmt != null) {\r
293             fIcuDecfmt.setDecimalSeparatorAlwaysShown(newValue);\r
294         }\r
295     }\r
296 \r
297     @Override\r
298     public void setGroupingSize(int newValue) {\r
299         if (fIcuDecfmt != null) {\r
300             fIcuDecfmt.setGroupingSize(newValue);\r
301         }\r
302     }\r
303 \r
304     @Override\r
305     public void setMaximumFractionDigits(int newValue) {\r
306         if (fIcuDecfmt != null) {\r
307             fIcuDecfmt.setMaximumFractionDigits(newValue);\r
308         }\r
309     }\r
310 \r
311     @Override\r
312     public void setMaximumIntegerDigits(int newValue) {\r
313         if (fIcuDecfmt != null) {\r
314             fIcuDecfmt.setMaximumIntegerDigits(newValue);\r
315         }\r
316     }\r
317 \r
318     @Override\r
319     public void setMinimumFractionDigits(int newValue) {\r
320         if (fIcuDecfmt != null) {\r
321             fIcuDecfmt.setMinimumFractionDigits(newValue);\r
322         }\r
323     }\r
324 \r
325     @Override\r
326     public void setMinimumIntegerDigits(int newValue) {\r
327         if (fIcuDecfmt != null) {\r
328             fIcuDecfmt.setMinimumIntegerDigits(newValue);\r
329         }\r
330     }\r
331 \r
332     @Override\r
333     public void setMultiplier(int newValue) {\r
334         fIcuDecfmt.setMultiplier(newValue);\r
335     }\r
336 \r
337     @Override\r
338     public void setNegativePrefix(String newValue) {\r
339         fIcuDecfmt.setNegativePrefix(newValue);\r
340     }\r
341 \r
342     @Override\r
343     public void setNegativeSuffix(String newValue) {\r
344         fIcuDecfmt.setNegativeSuffix(newValue);\r
345     }\r
346 \r
347     @Override\r
348     public void setParseBigDecimal(boolean newValue) {\r
349         fIcuDecfmt.setParseBigDecimal(newValue);\r
350     }\r
351 \r
352     @Override\r
353     public void setPositivePrefix(String newValue) {\r
354         fIcuDecfmt.setPositivePrefix(newValue);\r
355     }\r
356 \r
357     @Override\r
358     public void setPositiveSuffix(String newValue) {\r
359         fIcuDecfmt.setPositiveSuffix(newValue);\r
360     }\r
361 \r
362     @Override\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
380         } else {\r
381             throw new IllegalArgumentException("Invalid rounding mode was specified.");\r
382         }\r
383     }\r
384 \r
385     @Override\r
386     public String toLocalizedPattern() {\r
387         return fIcuDecfmt.toLocalizedPattern();\r
388     }\r
389 \r
390     @Override\r
391     public String toPattern() {\r
392         return fIcuDecfmt.toPattern();\r
393     }\r
394 \r
395     // Methods overriding java.text.NumberFormat\r
396 \r
397     @Override\r
398     public boolean isGroupingUsed() {\r
399         return fIcuDecfmt.isGroupingUsed();\r
400     }\r
401 \r
402     @Override\r
403     public boolean isParseIntegerOnly() {\r
404         return fIcuDecfmt.isParseIntegerOnly();\r
405     }\r
406 \r
407     @Override\r
408     public void setGroupingUsed(boolean newValue) {\r
409         if (fIcuDecfmt != null) {\r
410             fIcuDecfmt.setGroupingUsed(newValue);\r
411         }\r
412     }\r
413 \r
414     @Override\r
415     public void setParseIntegerOnly(boolean value) {\r
416         fIcuDecfmt.setParseIntegerOnly(value);\r
417     }\r
418 \r
419     private static AttributedCharacterIterator.Attribute mapAttribute(AttributedCharacterIterator.Attribute icuAttribute) {\r
420         AttributedCharacterIterator.Attribute jdkAttribute = icuAttribute;\r
421 \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
444         }\r
445 \r
446         return jdkAttribute;\r
447     }\r
448 \r
449 }\r