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}